Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式;或;使用findall时给出空字符串_Python_Regex - Fatal编程技术网

Python正则表达式;或;使用findall时给出空字符串

Python正则表达式;或;使用findall时给出空字符串,python,regex,Python,Regex,我使用一个简单的正则表达式来匹配字符串中的int/float/double值。执行findall时,正则表达式在输出中显示空字符串。当我删除|操作符并进行单独匹配时,空字符串将被删除。我也试过这个,它不显示任何空字符串。如何删除此空字符串?这是我的密码: >>>import re >>>match_float = re.compile('(.*?)(\d+[.]\d+)|(.*?)(\d+)') >>>match_float.findall(

我使用一个简单的正则表达式来匹配字符串中的int/float/double值。执行
findall
时,正则表达式在输出中显示空字符串。当我删除
|
操作符并进行单独匹配时,空字符串将被删除。我也试过这个,它不显示任何空字符串。如何删除此空字符串?这是我的密码:

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

>>>[('CA$', '1.90', '', '')]
>>>[('', '', 'RM', '1')]
由于您在模式中定义了4,因此它们将始终是
re.findall
输出的一部分,除非您删除它们(例如,使用
filter(None…)

但是,在当前情况下,您可能会将模式“收缩”到

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

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

详细信息

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

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