我试图找到一种模式,让我找到一个四位数的年份。但是我不想得到哪一年在一年之前的结果,例如#34;这是2009年1月和#34;不应该给出任何结果,但是"这是2009年"应该回到2009年。我在1月| 2月使用findall和lookbehind,但我得到了2009年的#39;而不是空白。我错过了什么?怎么做?
答案 0 :(得分:0)
任何其他匹配的字符串前面都有一个匹配负向lookbehind的字符串不匹配。
在您当前的正则表达式中,forEach
匹配[a-z]* \d{4}
。
负面后瞻"an 2009"
与'(?<!Jan|Feb)'
部分不匹配,因此不会触发。
如果从正则表达式中删除"This is J"
,则不会在测试字符串上返回匹配项。
解决此类问题:
首先,写下您想要的匹配'[a-z]*'
然后,写下你不想要的\d{4}
那是(?<!Jan |Feb )
答案 1 :(得分:0)
你可能想试试这个:
(小于一月| 2月?!)的(R)(小于?!uary)\ S + [0-9] * [0-9]
希望它有所帮助。
答案 2 :(得分:0)
这个通用示例适用于您在上述问题中提到的案例(编辑以说明完整月份名称):
输入:
'This is 2009'
'This is Jan 2009'
REGEX:
re.findall(r'(?:\b[^A-Z][a-z]+\s)(\d{4})', text))
输出:
['2009']
[]
说明:
?:表示非捕获组,因此它不会包含在输出
中\ b断言一个单词边界
^ [A-Z]断言该单词不以大写字母
开头[a-z] +断言它后跟一个或多个小写字母
\ s占任何空白字符
(\ d {4})为一个数字(\ d)声明一个捕获组,发生四次{4}