>> m = re.search(r"\s*Tel\.:-6ren">
gpt4 book ai didi

python - 正则表达式中不匹配的可选字符串

转载 作者:行者123 更新时间:2023-11-28 23:06:53 25 4
gpt4 key购买 nike

字符串 s 更大,但我已将其缩短以简化。

>>> import re
>>> s = "Blah. Tel.: 555 44 33 22."
>>> m = re.search(r"\s*Tel\.:\s*(?P<telephone>.+?)\.", s)
>>> m.group("telephone")
'555 44 33 22'

上面的代码有效,但如果我将正则表达式包装在 ()? 中以使其成为可选的,我就不会收到任何电话。

>>> m = re.search(r"(\s*Tel\.:\s*(?P<telephone>.+?)\.)?", s)
>>> m
<_sre.SRE_Match object at 0x9369890>
>>> m.group("telephone")

这里有什么问题?谢谢!

编辑:

这是一个更大的正则表达式的一部分,我从一个大文件的每一行中获取许多值。

regex = r"^(?P<title>.[^(]+);" \
"\s*(?P<subtitle>.+)\." \
"\s*Tel\.:\s*(?P<telephone>.+?)(\.|;)" \
"\s*(?P<url>(www\.|http://).+?\.[a-zA-Z]+)(\.|;)" \
"(\s*(?P<text>.+?)\.)?" \
"\s*coor:(\s*(?P<lat>.+?),\s*(?P<long>.+?))?$"

一个示例行可以是:

l = "Title title; Subtitle, subtitle. Tel.: 555 33 44 11. www.url.com. coor: 11.11111, -2.222222

和其他样例行:

l = "Title2 title; Subtitle2, subtitle. Tel.: 555 33 44 11. www.url2.com. coor: 44.444444, -6.66666

这是一个非常大的正则表达式,所以这就是我没有发布它的原因。

最佳答案

这是因为空字符串是您的正则表达式的有效匹配项,并且优于较长的匹配项。

您可能想看看 re.findall .

编辑:您可以将可选性完全移出正则表达式:

import re
s = "Blah. Tel.: 555 44 33 22."
m = re.search(r"\s*Tel\.:\s*(?P<telephone>.+?)\.", s)
if m is not None:
print m.group("telephone")

关于python - 正则表达式中不匹配的可选字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4398534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com