为了账号安全,请及时绑定邮箱和手机立即绑定

从Python中的字符串列表中获取十进制数/整数之前的所有值

从Python中的字符串列表中获取十进制数/整数之前的所有值

森栏 2022-07-19 16:55:11
我有一个字符串列表,我想将每个字符串拆分为一个浮点数。如果字符串中没有浮点数,我想将它拆分为一个数字。它应该只拆分一次并返回它之前和之后的所有内容,并用逗号分隔。输入字符串:['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'那就是代码不会进入其他部分。一个观察是我的正则表达式的拆分函数正在创建一个列表列表,即 regex_float_part 和 regex_integer_part 是列表列表。谁能帮我解决我的代码没有响应的字符串的问题
查看完整描述

2 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

你的正则表达式几乎是正确的,但你必须考虑.到点后面的数字和数字可能不存在。这可以这样实现:

\s+(\d+(?:\.\d+)?)\s+

不同之处在于,您可以通过在组后使用问号将其添加到可能存在或不存在\.\d+的非捕获组中:(?:xxxx)(?:xxxx)?


查看完整回答
反对 回复 2022-07-19
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

我建议使用


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())))

请参阅正则表达式演示。


没有注释代码的完整Python 演示:


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']]


查看完整回答
反对 回复 2022-07-19
  • 2 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信