【发布时间】:2016-01-27 04:35:42
【问题描述】:
我无法理解这个正则表达式的输出。我正在使用以下正则表达式在文本中查找日期:
^(?:(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 个额外的值。
如何使它只匹配完整的日期字符串而不是字符串的一小部分?
从我的控制台:
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})
【问题讨论】: