Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中使用带有可选字符的正则表达式?_Python_Regex - Fatal编程技术网

如何在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'>```