试图理解python正则表达式与\ Z,\ b,$ vs匹配的字符串结尾只是结束表达式

时间:2017-04-12 21:20:11

标签: python regex string match

设置:我有一个正则表达式,匹配最后有迷路标点符号的人名,除非该标点符号属于单字母首字母的一部分。所以,“林肯,安倍晋三。”应该匹配,“Lincoln,A。”不应该。我写了一个对我来说很好的表达,但我很疑惑为什么我以前的尝试不起作用。

查询:我想弄明白为什么我需要在正则表达式中包含一个字符串结尾的锚点。 以下是成功匹配的表达式,就像我期望的那样:

(Pdb) re.compile("(.*)(\w{2,})([?:.,;]*?)\Z").match("abc,. def....").groups()
('abc,. d', 'ef', '....')
(Pdb) re.compile("(.*)(\w{2,})([?:.,;]*?)\b").match("abc,. def....").groups()
*** AttributeError: 'NoneType' object has no attribute 'groups'
(Pdb) re.compile("(.*)(\w{2,})([?:.,;]*?)$").match("abc,. def....").groups()
('abc,. d', 'ef', '....')

我认为我也应该能够匹配我的单词,而不会在字符串结尾字符中结束我的正则表达式。但是,只有前两个组被确认,第三个组被返回为空:

(Pdb) re.compile("(.*)(\w{2,})([?:.,;]*?)").match("abc,. def....").groups()
('abc,. d', 'ef', '')

我已经查看了有关SO和api文档(https://docs.python.org/2/library/re.html)上的字符串结束匹配的问题。到目前为止,我不太明白,并希望得到任何帮助。

1 个答案:

答案 0 :(得分:0)

*?表示非贪婪的匹配,因此它将匹配尽可能少的字符。当需要跟随字符串的结尾时,它被强制保持匹配,但是如果你删除了那个限制,那么它就没有义务匹配任何东西(而不是)。

简化示例:

# non-greedy
re.search(r'^.*?$', 'hello world').group() == 'hello world'
re.search(r'^.*?l', 'hello world').group() == 'hel'
re.search(r'^.*?', 'hello world').group() == ''

# greedy
re.search(r'^.*$', 'hello world').group() == 'hello world'
re.search(r'^.*l', 'hello world').group() == 'hello worl'
re.search(r'^.*', 'hello world').group() == 'hello world'