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