用于分组的正则表达式(?:)和结尾的$

时间:2014-04-16 16:11:50

标签: python regex python-3.x

我有常规快递

(?P<month>[1-9]|1[012])/(?P<day>([0-2])?[1-9]|3[01])/(?P<year>([0-2]\d)*\d\d)

它假设过滤掉:

Match: 1/1/2000, 1/1/00, 1/01/00, 1/31/00, 2/31/2000, 1/1/0000 

Not Match: 05/1/00, 13/1/00, 2/005/00, 1/32/00, 1/1/200, 1/1/20000, 5/0/2000 

我得到了所有的比赛,但不知怎的,不匹配继续妨碍

"5/1/00" "3/1/00" "1/1/20" "1/1/2000"

如何正确分组?我想在最后使用(?:)和$但仍然以某种方式卡住了?任何帮助表示赞赏。

我在pythex.org上试用我的代码。

2 个答案:

答案 0 :(得分:0)

您的正则表达式也匹配子字符串;你需要添加开始和结束锚点。

如果您只匹配整个字符串,请使用:

^(?P<month>[1-9]|1[012])/(?P<day>([0-2])?[1-9]|3[01])/(?P<year>([0-2]\d)*\d\d)$

否则,使用负面的环顾:

(?<!\d)(?P<month>[1-9]|1[012])/(?P<day>([0-2])?[1-9]|3[01])/(?P<year>([0-2]\d)*\d\d)(?!\d)

如果匹配的文本前面有数字,(?<!\d)会阻止您的模式匹配,(?!\d)会阻止模式匹配,如果文本后面有数字。

Pythex demonstration使用后一种形式。

演示:

>>> import re
>>> dates = re.compile(r'(?<!\d)(?P<month>[1-9]|1[012])/(?P<day>([0-2])?[1-9]|3[01])/(?P<year>([0-2]\d)*\d\d)(?!\d)')
>>> dates.findall('Match: 1/1/2000, 1/1/00, 1/01/00, 1/31/00, 2/31/2000, 1/1/0000')
[('1', '1', '', '2000', '20'), ('1', '1', '', '00', ''), ('1', '01', '0', '00', ''), ('1', '31', '', '00', ''), ('2', '31', '', '2000', '20'), ('1', '1', '', '0000', '00')]
>>> dates.findall('Not Match: 05/1/00, 13/1/00, 2/005/00, 1/32/00, 1/1/200, 1/1/20000, 5/0/2000 ')
[]

答案 1 :(得分:0)

像这样使用单词边界:

\b(?P<month>[1-9]|1[012])/(?P<day>([0-2])?[1-9]|3[01])/(?P<year>([0-2]\d)*\d\d)\b