Python 3正则表达式返回意外结果

时间:2017-08-04 14:09:22

标签: python regex

我不明白为什么两个跟随代码块会给测试用例带来不同的结果。第一个代码块按预期返回2016,但是当进行一个小的更改时,第二个代码块返回None。

这是第一个,按预期返回'2016'

import re
date = '24 Jan 2016'
def func(line):
    month_regex = re.search('(\d{1,2})\s(Jan)\s(\d{2,4})', line)
    if month_regex:
        year = month_regex.group(3)
    return year
func(date)

然后,我加上“(uary)?”到正则表达式,由于某种原因,它返回None。请注意,组(1)和组(2)的结果在两种情况下都相同。

import re
date = '24 Jan 2016'
def func(line):
    month_regex = re.search('(\d{1,2})\s(Jan(uary)?)\s(\d{2,4})', line)
    if month_regex:
        year = month_regex.group(3)
    return year
func(date)

为什么第二个代码块返回None?

1 个答案:

答案 0 :(得分:5)

由于第二个正则表达式包含额外的(uary)? 捕获组,因此匹配结果现在包含4个组,而.group(3)不再映射到年份,而是映射到可选{ {1}}子串。由于输入在uary之后没有uary,因此组值为,它只是未初始化。

在保持组结构完整性的同时添加可选组的最佳方法是通过non-capturing groups

Jan

请参阅Python demo online

这里,小组如下:

month_regex = re.search(r'(\d{1,2})\s(Jan(?:uary)?)\s(\d{2,4})', line)
                                         ^^ 

此外,最好使用原始字符串文字进行正则表达式模式声明,以避免在添加单词边界或反向引用时出现进一步的误解。