2016-01-27 59 views
1

我無法理解此正則表達式的輸出。我使用正則表達式如下找到文本日期:Python正則表達式不按預期方式返回

^(?:(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})

回答

1

每個()是一個捕獲組, (1[0-2]|0?[1-9])捕獲10,(3[01]|[12][0-9]|0?[1-9])捕獲20,依此類推。當你圍繞()中的所有內容時,它會在另一個()之前出現並匹配所有內容。您可以忽略被捕獲的組,名爲non-captured group,使用(?:)而不是()

+0

謝謝!我知道我錯過了一些東西。修改爲此,它正在工作:((?:(?: 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}) – user3246693

相關問題