如何在Python中使用正则表达式来匹配可选字符?

46

假设我有一个字符串

"3434.35353"

还有另一个字符串

"3593"

我该如何编写一个正则表达式能够匹配这两种情况而无需在模式不匹配时对模式进行更改?我知道 \d+ 可以匹配 3593,但它对于 3434.35353 没有任何作用,而 (\d+\.\d+) 只能匹配带小数点的数字,并返回找不到匹配项给 3593

我希望 m.group(1) 返回:

"3434.35353"
或。
"3593"
5个回答

78

你可以在一组字符后面加上一个问号?来使其变为可选项。

你想要一个点后面跟着任意数量的数字\.\d+,将它们分组(\.\d+),可选地出现(\.\d+)?。把它放入你的模式中:

import re
print re.match("(\d+(\.\d+)?)", "3434.35353").group(1)
3434.35353
print re.match("(\d+(\.\d+)?)", "3434").group(1)
3434

5
这个正则表达式应该可以工作:
\d+(\.\d+)?

它匹配一个或多个数字(\d+),后面可以跟着一个点和一个或多个数字((\.\d+)?)。


3

使用(?:<字符>|)。将<字符>替换为可选的字符串。我在Python shell中进行了测试,得到了以下结果:

最初的回答:

使用正则表达式中的非捕获组(?:...)来实现可选项功能。将需要变为可选的字符或字符串放入括号内,用|符号与空字符串分隔即可。此方法可以在Python shell中进行测试。

>>> s = re.compile('python(?:3|)')
>>> s
re.compile('python(?:3|)')
>>> re.match(s, 'python')
<re.Match object; span=(0, 6), match='python'>
>>> re.match(s, 'python3')
<re.Match object; span=(0, 7), match='python3'>```

1
当我不想使用嵌套捕获组时,我更喜欢这种方法。例如,如果要捕获括号中的所有数字和'.',如'(1)'或'(333.333.333)'。我希望能够捕获整个字符串(以及后面的更多内容)。我可以将它们作为一个组进行处理,以便以后迭代。 - Clay

2
使用“一或零”量词符号?。您的正则表达式将变为:(\d+(\.\d+)?)
有关可用不同量词符号及其使用方法的更多详细信息,请参阅TextWrangler手册第8章。

1

学习Python RegEx库。该链接可以回答你的问题并解释原因。

但是,要匹配一个数字后面跟着更多数字并带有可选小数点,可以使用以下代码:

re.compile("(\d+(\.\d+)?)")

在这个例子中,.\d+ 捕获组后面的 ? 表示此部分是可选的。

示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接