字符串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包装在()?
中使其成为可选的,我就没有任何电话。在
有什么问题吗?谢谢!在
编辑:
这是一个更大的正则表达式的一部分,在这个表达式中,我从一个大文件的每一行获取许多值。在
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
这是一个非常大的正则表达式,所以我没有发布它。在
这是因为空字符串是正则表达式的有效匹配项,并且比较长的匹配项更可取。在
您可能想看看^{} 。在
您可以完全退出正则表达式:
(anything)?
与字符串开头的零字符串匹配(在Blah
之前),因此它很高兴,不必费心进一步搜索。在编辑:
如果有许多行,但其中只有一部分包含所需的字符串,请尝试以下操作:
您的regex在
title
和subtitle
位匹配方面太不具体。他们正在吞噬电话部分,如果这是可选的,它将在regex的下一部分继续(并成功)。只有在它不是可选的情况下,正则表达式引擎必须回溯才能找到一个整体匹配。在试试看
相关问题 更多 >
编程相关推荐