使用Python Regex匹配'mm / yyyy'而不是'mm / dd / yyyy'

时间:2017-08-06 13:24:23

标签: python regex

我想使用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'的更好方法?

1 个答案:

答案 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