我正在使用一个简单的正则表达式(.*?)(\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')]
答案 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')]