如何在python中使用带有可选字符的正则表达式?
说我有一根绳子如何在python中使用带有可选字符的正则表达式?,python,regex,Python,Regex,说我有一根绳子 "3434.35353" 3434.35353 还有一根绳子 "3593" 如果另一个正则表达式失败,我如何创建一个能够同时匹配这两个正则表达式的正则表达式,而不必将模式设置为其他模式?我知道\d+将匹配3593,但它对3434.35353没有任何作用,但是(\d+.\d+)将只匹配带小数的一个,并且不会返回与3593匹配的结果 我希望m.group(1)返回: "3434.35353" 或 您可以在一组字符后添加一个?,使其成为可选字符 您需要一个点,后跟任意数量的数字
"3434.35353"
3434.35353
还有一根绳子
"3593"
如果另一个正则表达式失败,我如何创建一个能够同时匹配这两个正则表达式的正则表达式,而不必将模式设置为其他模式?我知道\d+
将匹配3593
,但它对3434.35353
没有任何作用,但是(\d+.\d+
)将只匹配带小数的一个,并且不会返回与3593
匹配的结果
我希望m.group(1)
返回:
"3434.35353"
或
您可以在一组字符后添加一个
?
,使其成为可选字符
您需要一个点,后跟任意数量的数字\.\d+
,分组在一起(\.\d+)
,也可以选择(\.\d+)?
。按照你的模式:
import re
print re.match("(\d+(\.\d+)?)", "3434.35353").group(1)
使用“一或零”量词,?
。您的正则表达式变成:(\d+(\。\d+))
有关可用的不同量词以及如何使用它们的更多详细信息,请参见的第8章。此正则表达式应适用于:
\d+(\.\d+)?
它与一个或多个数字(\d+
)匹配,后面可选地跟一个点和一个或多个数字((\.\d+)
)。在库中读取。该链接回答了您的问题并解释了原因
但是,要将一个数字后跟多个数字与可选的十进制匹配,可以使用
re.compile("(\d+(\.\d+)?)")
在本例中?在\d+
捕获组指定此部分为可选部分之后
使用(?:|)
。用字符串替换
,使其成为可选字符串。我在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'>```
>s=re.compile('python(?:3 |)'))
>>>
重新编译('python(?:3 |)'))
>>>关于匹配(s'python')
>>>关于匹配(s,“蟒蛇3”)
```
当我不想使用嵌套的捕获组时,我更喜欢这种方法。例如,如果希望捕获“(1)”或“(333.333.333)”的括号内的所有数字&“.”。我想整个字符串(和更多的东西后)。我可以将它们作为一个组来处理,以便在以后的迭代中使用。
\d+(\.\d+)?
re.compile("(\d+(\.\d+)?)")
>>> 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'>```