我无法理解这个正则表达式的输出。我使用以下正则表达式在文本中查找日期:
^(?:(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})
?答案 0 :(得分:1)
每个()
都是已捕获的群组,(1[0-2]|0?[1-9])
抓取10
,(3[01]|[12][0-9]|0?[1-9])
抓取20
,依此类推。当你围绕()
中的所有内容时,它会在另一个()
之前出现并匹配所有内容。您可以忽略被称为non-captured group
的已捕获组,使用(?:)
代替()
。