无法从python正则表达式中的lookbehind获得所需的结果

时间:2018-02-21 03:53:51

标签: python regex

我试图找到一种模式,让我找到一个四位数的年份。但是我不想得到哪一年在一年之前的结果,例如#34;这是2009年1月和#34;不应该给出任何结果,但是"这是2009年"应该回到2009年。我在1月| 2月使用findall和lookbehind,但我得到了2009年的#39;而不是空白。我错过了什么?怎么做?

3 个答案:

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