我有一个字符串列表,我想将每个字符串拆分成一个浮点数。如果字符串中没有浮点数,我希望将其拆分为一个数字。它应该只拆分一次,并返回由逗号分隔的前后的所有内容。
输入字符串:
['Naproxen 500 Active ingredient Ph Eur',
'Croscarmellose sodium 22.0 mg Disintegrant Ph Eur',
'Povidone K90 11.0 Binder 56 Ph Eur',
'Water, purifieda,
'Silica, colloidal anhydrous 2.62 Glidant Ph Eur',
'Water purified 49 Solvent Ph Eur',
'Magnesium stearate 1.38 Lubricant Ph Eur']预期输出:
['Naproxen', '500', 'Active ingredient Ph Eur',
'Croscarmellose sodium', '22.0 mg', 'Disintegrant Ph Eur',
'Povidone K90', '11.0', 'Binder Ph Eur',
'Water, purifieda',
'Silica, colloidal anhydrous', '2.62', 'Glidant Ph Eur',
'Water purified', '49', 'Solvent Ph Eur',
'Magnesium stearate', '1.38', 'Lubricant Ph Eur']我的代码:
for i in newresult:
regex_float_part = re.split(r'\s+(\d+\.\d+)\s+', i, 1)
# print(regex_float_part)
# regex_float_part_n = [item for sublist in regex_float_part for item in sublist]
if regex_float_part:
all_extract.append(regex_float_part)
else:
# regex_integer = r'\s+(\d+(?:\\d+)?)\s+'
regex_integer_part = re.split(r'\s+(\d+(?:\\d+)?)\s+', i, 1)
# regex_integer_part_n = [item for sublist in regex_integer_part for item in sublist]
all_extract.append(regex_integer_part)问题出在以下输入字符串上:
'Water purified 49 Solvent Ph Eur',这不是预期的结果,这是:
'Water purified', '49', 'Solvent Ph Eur'也就是说,代码不会进入else部分。一种观察结果是,我的正则表达式的拆分函数创建了一个列表列表,即regex_float_part和regex_integer_part是列表列表。有没有人能帮我解决我的代码没有响应的字符串
发布于 2020-02-04 20:21:51
您的正则表达式几乎是正确的,但是您必须考虑到.和点后的数字可能不在那里。这可以像这样实现:
\s+(\d+(?:\.\d+)?)\s+不同之处在于,您可以将\.\d+添加到可能存在或不存在的非捕获组(?:xxxx)中,方法是在组后面使用问号:(?:xxxx)?
发布于 2020-02-04 21:13:31
我建议使用
res = re.match(r'^(?:(?!.*\d\.\d)(.*?)\s*\b(\d+(?:\s*mg)?)\b\s*(.*)|((?:(?!\d+\.\d).)*?)\s*\b(\d+\.\d+(?:\s*mg)?)\b\s*(.*))$', i)
if res:
all_extract.append(list(filter(None, res.groups())))请参阅regex demo。
完整的Python demo without commented code
import re
def show():
newresult = ['Naproxen 500 Active ingredient Ph Eur','Croscarmellose sodium 22.0 mg Disintegrant Ph Eur','Povidone K90 11.0 Binder 56 Ph Eur','Water, purifieda','Silica, colloidal anhydrous 2.62 Glidant Ph Eur','Water purified 49 Solvent Ph Eur','Magnesium stearate 1.38 Lubricant Ph Eur']
all_extract = []
for i in newresult:
res = re.match(r'^(?:(?!.*\d\.\d)(.*?)\s*\b(\d+(?:\s*mg)?)\b\s*(.*)|((?:(?!\d+\.\d).)*?)\s*\b(\d+\.\d+(?:\s*mg)?)\b\s*(.*))$', i)
if res:
all_extract.append(list(filter(None, res.groups())))
else:
print("ONLY INTEGER")
regex_integer_part = re.split(r'\s+(\d+(?:\.\d+)?)\s+', i, 1)
all_extract.append(regex_integer_part)
return all_extract
print(show())收益率
[['Naproxen', '500', 'Active ingredient Ph Eur'], ['Croscarmellose sodium', '22.0 mg', 'Disintegrant Ph Eur'], ['Povidone K90', '11.0', 'Binder 56 Ph Eur'], ['Water, purifieda'], ['Silica, colloidal anhydrous', '2.62', 'Glidant Ph Eur'], ['Water purified', '49', 'Solvent Ph Eur'], ['Magnesium stearate', '1.38', 'Lubricant Ph Eur']]
https://stackoverflow.com/questions/60057011
复制相似问题