Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3正则表达式返回意外结果_Python_Regex - Fatal编程技术网

Python3正则表达式返回意外结果

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

我不明白为什么这两个后续代码块对测试用例给出了不同的结果。第一个代码块按预期返回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)?”添加到正则表达式中,出于某种原因,它不返回任何值。请注意,第(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风格的正则表达式。