使用findall时,Python正则表达式“OR”给出空字符串

时间:2017-08-25 07:16:00

标签: python regex

我正在使用一个简单的正则表达式(.*?)(\d+[.]\d+)|(.*?)(\d+)来匹配字符串中的int / float / double值。执行findall时,正则表达式在输出中显示空字符串。删除|运算符并执行单个匹配后,空字符串将被删除。我也在regex101上尝试了这个,它没有显示任何空字符串。如何删除这个空字符串?这是我的代码:

>>>import re
>>>match_float = re.compile('(.*?)(\d+[.]\d+)|(.*?)(\d+)')
>>>match_float.findall("CA$1.90")  
>>>match_float.findall("RM1")

输出:

>>>[('CA$', '1.90', '', '')]
>>>[('', '', 'RM', '1')]

1 个答案:

答案 0 :(得分:1)

由于您在模式中定义了4 capturing groups,因此除非您将其删除(例如,使用re.findall,否则它们将始终属于filter(None, ...)输出。

但是,在目前的情况下,您可以将模式“缩小”为

r'(.*?)(\d+(?:\.\d+)?)'

请参阅regex demo

现在,它只有2个捕获组,因此findall只会在结果列表中为每个元组输出2个项目。

<强>详情:

  • (.*?) - 捕获第1组匹配除了换行符之外的任何零个或多个字符,尽可能少到第一次出现...
  • (\d+(?:\.\d+)?) - 捕获第2组:
    • \d+ - 一个或多个数字
    • (?:\.\d+)? - 一个可选的*非*捕获组,匹配1个或0个.和1+个数字。

请参阅Python demo

import re
rx = r"(.*?)(\d+(?:[.]\d+)?)"
ss = ["CA$1.90", "RM1"]
for s in ss:
    print(re.findall(rx, s))
# => [('CA$', '1.90')]  [('RM', '1')]