我不明白为什么两个跟随代码块会给测试用例带来不同的结果。第一个代码块按预期返回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?
答案 0 :(得分:5)
由于第二个正则表达式包含额外的(uary)?
捕获组,因此匹配结果现在包含4个组,而.group(3)
不再映射到年份,而是映射到可选{ {1}}子串。由于输入在uary
之后没有uary
,因此组值为无,它只是未初始化。
在保持组结构完整性的同时添加可选组的最佳方法是通过non-capturing groups:
Jan
这里,小组如下:
month_regex = re.search(r'(\d{1,2})\s(Jan(?:uary)?)\s(\d{2,4})', line)
^^
此外,最好使用原始字符串文字进行正则表达式模式声明,以避免在添加单词边界或反向引用时出现进一步的误解。