例?7.14.?處理開始字符
...
>>> phonePattern = re.compile(r'^\D*(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$') 1
>>> phonePattern.search('(800)5551212 ext. 1234').groups() 2
('800', '555', '1212', '1234')
>>> phonePattern.search('800-555-1212').groups() 3
('800', '555', '1212', '')
>>> phonePattern.search('work 1-(800) 555.1212 #1234') 4
>>>
1 |
這個正則表達(dá)式和前面的幾乎相同,除了在第一個記憶組(區(qū)號)前面匹配\D*,0或者多個非數(shù)字字符。注意,此處你沒有記憶這些非數(shù)字字符(他們沒有被括號括起來)。如果你發(fā)現(xiàn)他們,只是跳過他們,接著只要匹配上就開始記憶區(qū)號。
|
?2 |
你可以成功的解析電話號碼,即使在區(qū)號前面有一個左括號。(在區(qū)號后面的右括號也已經(jīng)被處理,它被看成非數(shù)字字符分隔符,由第一個記憶組后面的 \D*匹配。)
|
?3 |
進(jìn)行仔細(xì)的檢查,保證你沒有破壞前面能夠匹配的任何情況。由于首字符是完全可選的,這個模式匹配字符串的開始,接著是0個非數(shù)字字符,接著是一個有三個數(shù)字字符的記憶組(800),接著是1個非數(shù)字字符(連字符),接著是一個有三個數(shù)字字符的記憶組(555),接著是1個非數(shù)字字符(連字符),接著是一個有四個數(shù)字字符的記憶組(1212),接著是0個非數(shù)字字符,接著是一個有0個數(shù)字位的記憶組,最后是字符串的結(jié)尾。
|
?4 |
此處是正則表達(dá)式讓我產(chǎn)生了找一個硬東西挖出自己的眼睛的沖動。為什么這個電話號碼沒有匹配上?因?yàn)樵谒膮^(qū)號前面有一個 1,但是你認(rèn)為在區(qū)號前面的所有字符都是非數(shù)字字符(\D*)。 Aargh. |