带(?)?:)用于分组,结尾为$

2024-03-29 16:02:19 发布

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

我有普通快车

(?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网站. 你知道吗


Tags: 代码org网站match方式notyearday
2条回答

用词边界如下:

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

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

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

^(?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 ')
[]

相关问题 更多 >