我想使用Python正则表达式匹配日期。我有05/21/1990(mm / dd / yyyy)和01/1990(mm / yyyy)。我怎样才能匹配第二个。我尝试了以下代码
>>> re.search(r'\b\d{1,2}/\d{2,4}\b', '5/1/1990').group(0)
'1/1990'
但它不起作用。有人可以解释原因吗?不是'\ b'代表单词边界?什么是匹配'mm / yyyy'的更好方法?
答案 0 :(得分:3)
\b
匹配\w
和\W
个字符之间的边界。数字为\w
个字符,/
为\W
字符,因此/2
计为此边界。
您希望使用否定 lookbehind 和预测(分别为(?<!...)
和(?!...)
):
(?<![/\d])\d{1,2}/\d{2,4}(?![/\d])
如果在该模式之前和之后没有/
或数字,则模式现在匹配一个或两个数字,斜杠,然后是2,3或4位数。
演示:
>>> import re
>>> re.search(r'(?<![/\d])\d{1,2}/\d{2,4}(?![/\d])', 'Text with 05/21/1990') is None
True
>>> re.search(r'(?<![/\d])\d{1,2}/\d{2,4}(?![/\d])', 'Text with 01/1990')
<_sre.SRE_Match object; span=(10, 17), match='01/1990'>
https://regex101.com/r/6N5wOJ/1
的现场演示您可能希望缩小匹配的数字范围;您可以将99/999
与上述匹配,这显然不是月/年组合。以下内容将缩小为可能的月份值(01
- 12
)和20或21世纪的年份仅:
(?<![/\d])(?:0\d|[1][012])/(?:19|20)?\d{2}(?![/\d])
后者的现场演示,并举例说明:https://regex101.com/r/PnatMy/1