Python正则表达式未按预期返回

时间:2016-01-27 04:35:42

标签: python regex

我无法理解这个正则表达式的输出。我使用以下正则表达式在文本中查找日期:

^(?:(1[0-2]|0?[1-9])-(3[01]|[12][0-9]|0?[1-9])|(3[01]|[12][0-9]|0?[1-9])-(1[0-2]|0?[1-9]))-(?:[0-9]{2})?[0-9]{2}$

它似乎正确匹配文本中的模式,但我对返回值感到困惑。

对于此测试字符串:

TestString = "10-20-2015"

它返回了这个:

[('10', '20', '', '')]

如果我把()放在整个正则表达式中,我会得到这个:

[('10-20-2015', '10', '20', '', '')]

我希望它只是返回完整的日期字符串,但它似乎打破了结果,我不明白为什么。在()中包装我的正则表达式会返回完整的日期字符串,但它也会返回4个额外的值。

如何使此ONLY匹配完整日期字符串而不是字符串的小部分?

来自我的控制台:

Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> pattern = "^(?:(1[0-2]|0?[1-9])-(3[01]|[12][0-9]|0?[1-9])|(3[01]|[12][0-9]|0?[1-9])-(1[0-2]|0?[1-9]))-(?:[0-9]{2})?[0-9]{2}$"
>>> TestString = "10-20-2015"
>>> re.findall(pattern, TestString, re.I)
[('10', '20', '', '')]
>>> pattern = "(^(?:(1[0-2]|0?[1-9])-(3[01]|[12][0-9]|0?[1-9])|(3[01]|[12][0-9]|0?[1-9])-(1[0-2]|0?[1-9]))-(?:[0-9]{2})?[0-9]{2}$)"
>>> re.findall(pattern, TestString, re.I)
[('10-20-2015', '10', '20', '', '')]
>>> 
>>> TestString = "10--2015"
>>> re.findall(pattern, TestString, re.I)
[]
>>> pattern = "^(?:(1[0-2]|0?[1-9])-(3[01]|[12][0-9]|0?[1-9])|(3[01]|[12][0-9]|0?[1-9])-(1[0-2]|0?[1-9]))-(?:[0-9]{2})?[0-9]{2}$"
>>> re.findall(pattern, TestString, re.I)
[]

基于回答,这是我的答案:((?:(?:1 [0-2] | 0 [1-9]) - (?:3 [01] | [12] [0- 9] | 0 [1-9])|(?:3 [01] | [12] [0-9] | 0 [1-9]) - (?: 1 [0-2] | 0 [1- 9])) - (:[0-9] {2})[0-9] {2})

1 个答案:

答案 0 :(得分:1)

每个()都是已捕获的群组,(1[0-2]|0?[1-9])抓取10(3[01]|[12][0-9]|0?[1-9])抓取20,依此类推。当你围绕()中的所有内容时,它会在另一个()之前出现并匹配所有内容。您可以忽略被称为non-captured group的已捕获组,使用(?:)代替()