Python3正则表达式返回意外结果
我不明白为什么这两个后续代码块对测试用例给出了不同的结果。第一个代码块按预期返回2016,但当一个代码块进行一个小的更改时,第二个代码块将返回None 这是第一个,它会像预期的那样返回“2016”Python3正则表达式返回意外结果,python,regex,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 = mont
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)?”添加到正则表达式中,出于某种原因,它不返回任何值。请注意,第(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?由于第二个正则表达式包含一个额外的
(uary)
捕获组,匹配结果现在包含4个组和。组(3)
不再映射到年份,而是映射到可选的uary
子字符串。由于输入在Jan
之后没有uary
,所以组值为None,只是没有初始化
在保持组结构完整的同时添加可选组的最佳方法是:
看
在这里,分组如下:
(\d{1,2})\s(Jan(?:uary)?)\s(\d{2,4})
|-- 1 --| |---- 2 -----| |-- 3 --|
此外,最好使用原始字符串文字来声明正则表达式模式,以避免在添加单词边界或反向引用时进一步误解。由于第二个正则表达式包含一个额外的
(uary)
捕获组,匹配结果现在包含4个组和.group(3)
不再映射到年份,而是映射到可选的uary
子字符串。由于输入在Jan
之后没有uary
,所以组值为None,只是没有初始化
在保持组结构完整的同时添加可选组的最佳方法是:
看
在这里,分组如下:
(\d{1,2})\s(Jan(?:uary)?)\s(\d{2,4})
|-- 1 --| |---- 2 -----| |-- 3 --|
此外,最好的做法是在正则表达式模式声明中使用原始字符串文字,以避免在添加单词边界或反向引用时进一步误解。第一个代码段返回年份。看见第二个代码段,因为第三组不匹配。你的最终目标是什么?今年回来吗?那么,为什么第三组不比赛呢?\d{2,4}不匹配2016吗?但是
(uary)
是一个捕获组,它被分配了ID=3(因为它是模式中的第三个捕获组)(\d{2,4})
是第四组。啊,我的意思是让它成为一个非捕获组。谢谢继续添加它作为答案,我会选择它。使用在线正则表达式测试仪优化您的模式真的很有帮助。有几种使用Python风格的正则表达式。看见第二个代码段,因为第三组不匹配。你的最终目标是什么?今年回来吗?那么,为什么第三组不比赛呢?\d{2,4}不匹配2016吗?但是(uary)
是一个捕获组,它被分配了ID=3(因为它是模式中的第三个捕获组)(\d{2,4})
是第四组。啊,我的意思是让它成为一个非捕获组。谢谢继续添加它作为答案,我会选择它。使用在线正则表达式测试仪优化您的模式真的很有帮助。有几种使用Python风格的正则表达式。