以下是我遇到問題的串列的子集:
array(['DORFLEX 10 CP AV CH', 'CLOR.CICLOBENZAPRINA 5MG 30 CP EMS GEN C',
'ADVIL MULHER 400MG AVULSO', 'SPIDUFEN MENTA 600MG C/10 SACHES L',
'PONSTAN 500MG 8X3 CP', 'TANDRILAX 30 CP',
'PARACETAMOL 750MG 20 CP NEOQ GEN',
'DICLOFENACO SOD 50MG 20 CP MEDL GEN C','DORFLEX 30CP',
'BENLYSTA 200MG/ML SOL INJ 4 SER PRE 1ML GELAD'], dtype=object)
問題是,例如,串列的第一個元素:“DORFLEX 10 ...”(以及許多其他名稱)在串列中以相同的名稱重復出現,但其后的數字不同(大小不同) ,例如,“DORFLEX 15 ...”。我試圖只留下“DORFLEX”這個詞。在空格后洗掉字串可以解決這個特定問題,但我有很多復合名稱,例如“DICLOFENAC SOD 50MG ...”。這就是為什么我想在達到數字(包括數字)后洗掉整個字串,以減少重復但以不同尺寸出現的產品數量。
到目前為止,我還沒有找到任何讓我接近這一點的東西。歡迎任何幫助。非常感謝您提前
uj5u.com熱心網友回復:
您可以使用正向查找(正則運算式):
re.search('.*?(?=( \d)|$)', some_string).group()
或者將此應用于整個串列:
[re.search('.*?(?=( \d)|$)', line).group() for line in lines]
然后你一口氣得到所有的名字:
['DORFLEX',
'CLOR.CICLOBENZAPRINA',
'ADVIL MULHER',
'SPIDUFEN MENTA',
'PONSTAN',
'TANDRILAX',
'PARACETAMOL',
'DICLOFENACO SOD',
'DORFLEX',
'BENLYSTA']
uj5u.com熱心網友回復:
不知道為什么要使用 numpy 陣列,但可以使用正則運算式拆分第一個數字(如果有)。
這里以串列為例:
l = ['DORFLEX 10 CP AV CH', 'CLOR.CICLOBENZAPRINA 5MG 30 CP EMS GEN C',
'ADVIL MULHER 400MG AVULSO', 'SPIDUFEN MENTA 600MG C/10 SACHES L',
'PONSTAN 500MG 8X3 CP', 'TANDRILAX 30 CP',
'PARACETAMOL 750MG 20 CP NEOQ GEN',
'DICLOFENACO SOD 50MG 20 CP MEDL GEN C','DORFLEX 30CP',
'BENLYSTA 200MG/ML SOL INJ 4 SER PRE 1ML GELAD']
import re
out = [re.split('\s?\d', s, maxsplit=1)[0] for s in l]
或使用re.search:
out = [re.search('(\D*)\s?', line).group() for line in l]
輸出:
['DORFLEX', 'CLOR.CICLOBENZAPRINA', 'ADVIL MULHER', 'SPIDUFEN MENTA', 'PONSTAN',
'TANDRILAX', 'PARACETAMOL', 'DICLOFENACO SOD', 'DORFLEX', 'BENLYSTA']
如果你真的有一個 numpy array a,這是相同的邏輯:
out = np.array([re.split('\s?\d', s, maxsplit=1)[0] for s in a])
uj5u.com熱心網友回復:
你可以這樣做:
input_list = [
'DORFLEX 10 CP AV CH',
'CLOR.CICLOBENZAPRINA 5MG 30 CP EMS GEN C',
'ADVIL MULHER 400MG AVULSO',
'SPIDUFEN MENTA 600MG C/10 SACHES L',
'PONSTAN 500MG 8X3 CP',
'TANDRILAX 30 CP',
'PARACETAMOL 750MG 20 CP NEOQ GEN',
'DICLOFENACO SOD 50MG 20 CP MEDL GEN C',
'DORFLEX 30CP',
'BENLYSTA 200MG/ML SOL INJ 4 SER PRE 1ML GELAD'
]
output_list = []
for element in input_list:
for index, char in enumerate(element):
if char.isnumeric():
output_list.append(element[:index])
break
print(output_list)
# output:
# ['DORFLEX ',
# 'CLOR.CICLOBENZAPRINA ',
# 'ADVIL MULHER ',
# 'SPIDUFEN MENTA ',
# 'PONSTAN ',
# 'TANDRILAX ',
# 'PARACETAMOL ',
# 'DICLOFENACO SOD ',
# 'DORFLEX ',
# 'BENLYSTA ']
我們基本上遍歷 的elements input_list,然后遍歷每個 的索引和字符element。一旦我們點擊了一個數字字符,我們將element向上切片到該索引并將其附加到一個output_list. 然后我們從內部 for 回圈中中斷,以便立即進入下一個回圈element。
uj5u.com熱心網友回復:
其他答案似乎從您的姓名字串中洗掉了所有數值,或使用正則運算式。
這是一個更 Pythonic 的替代方案:
def extractName(fullStr):
spltName = fullStr.split(' ')
newSpltName = []
for subStr in spltName:
if not subStr.isdigit()
newSpltName.append(subStr)
else:
break
return ' '.join(newSpltName)
new_l = map(extractName, l)
uj5u.com熱心網友回復:
出于好奇,我決定比較各種方法的性能。我使用了這段代碼:
#!/usr/bin/env python3
from __future__ import annotations
import re
from timeit import timeit
l = [
"DORFLEX 10 CP AV CH",
"CLOR.CICLOBENZAPRINA 5MG 30 CP EMS GEN C",
"ADVIL MULHER 400MG AVULSO",
"SPIDUFEN MENTA 600MG C/10 SACHES L",
"PONSTAN 500MG 8X3 CP",
"TANDRILAX 30 CP",
"PARACETAMOL 750MG 20 CP NEOQ GEN",
"DICLOFENACO SOD 50MG 20 CP MEDL GEN C",
"DORFLEX 30CP",
"BENLYSTA 200MG/ML SOL INJ 4 SER PRE 1ML GELAD",
]
PROG = re.compile(".*?(?=( \d)|$)")
def with_compiled_regex(l: list[str]) -> list[str]:
return [PROG.search(x).group() for x in l]
def with_regex(l: list[str]) -> list[str]:
return [re.search(".*?(?=( \d)|$)", x).group() for x in l]
def without(l: list[str]) -> list[str]:
updated = []
for item in l:
new = []
for sub in item.split(" "):
if sub[0].isnumeric():
break
new.append(sub)
updated.append(" ".join(new))
return updated
print(timeit("with_regex(l)", globals=globals(), number=10000))
print(timeit("with_compiled_regex(l)", globals=globals(), number=10000))
print(timeit("without(l)", globals=globals(), number=10000))
這在以下附近提供了非常一致的結果:
0.130591894
0.07869331399999999
0.07071069099999999
正如您所看到的,沒有正則運算式可能會更快......但如果它被編譯,則不會快很多。因此,如果您打算這樣做,您將受益于不使用正則運算式或編譯您的搜索。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/425878.html
