假设我有一个字符串
"3434.35353"
还有另一个字符串
"3593"
我该如何编写一个正则表达式能够匹配这两种情况而无需在模式不匹配时对模式进行更改?我知道 \d+
可以匹配 3593
,但它对于 3434.35353
没有任何作用,而 (\d+\.\d+
) 只能匹配带小数点的数字,并返回找不到匹配项给 3593
。
我希望 m.group(1)
返回:
"3434.35353"
或。"3593"
你可以在一组字符后面加上一个问号?
来使其变为可选项。
你想要一个点后面跟着任意数量的数字\.\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
\d+(\.\d+)?
它匹配一个或多个数字(\d+
),后面可以跟着一个点和一个或多个数字((\.\d+)?
)。
使用(?:<字符>|)
。将<字符>
替换为可选的字符串。我在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'>```
学习Python RegEx库。该链接可以回答你的问题并解释原因。
但是,要匹配一个数字后面跟着更多数字并带有可选小数点,可以使用以下代码:
re.compile("(\d+(\.\d+)?)")
.\d+
捕获组后面的 ? 表示此部分是可选的。