可选字符串在正则表达式中不匹配

2024-04-26 18:39:59 发布

您现在位置:Python中文网/ 问答频道 /正文

字符串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'

上面的代码可以工作,但是如果我将regex包装在()?中使其成为可选的,我就没有任何电话。在

^{pr2}$

有什么问题吗?谢谢!在

编辑:

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

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

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


Tags: 字符串importrecomurlsearchtitlewww
3条回答

这是因为空字符串是正则表达式的有效匹配项,并且比较长的匹配项更可取。在

您可能想看看^{}。在

您可以完全退出正则表达式:

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")

(anything)?与字符串开头的零字符串匹配(在Blah之前),因此它很高兴,不必费心进一步搜索。在

编辑:

如果有许多行,但其中只有一部分包含所需的字符串,请尝试以下操作:

import re

rex = re.compile(r"\s*Tel\.:\s*(?P<telephone>.+?)\.")
for line in lines:
    m = rex.search(line)
    if m:
        print m.group("telephone")

您的regex在titlesubtitle位匹配方面太不具体。他们正在吞噬电话部分,如果这是可选的,它将在regex的下一部分继续(并成功)。只有在它不是可选的情况下,正则表达式引擎必须回溯才能找到一个整体匹配。在

试试看

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>.+?))?$"

相关问题 更多 >