前言
在許多的情況下,很多要匹配內容是一起出現,或者一起不出現的。比如《》,< >,這樣的括號,不存在使用半個的情況。因此,在正則表達式里也有一致性的判斷,要么兩個尖括號一起出現,要么一個也不要出現。怎么樣來實現這種判斷呢?針對這種情況得引入新的正則表達式的語法:(?=pattern),這個語法它會向前搜索或者向后搜索相關內容,如果不會出現就不能匹配。不過,這個匹配不會消耗任何輸入的字符,它只是查看一下。
例子如下:
#python 3.6 #蔡軍生 #http://blog.csdn.net/caimouse/article/details/51749579 # import re address = re.compile( ''''' # A name is made up of letters, and may include "." # for title abbreviations and middle initials. ((?P<name> ([/w.,]+/s+)*[/w.,]+ ) /s+ ) # name is no longer optional # LOOKAHEAD # Email addresses are wrapped in angle brackets, but only # if both are present or neither is. (?= (<.*>$) # remainder wrapped in angle brackets | ([^<].*[^>]$) # remainder *not* wrapped in angle brackets ) <? # optional opening angle bracket # The address itself: username@domain.tld (?P<email> [/w/d.+-]+ # username @ ([/w/d.]+/.)+ # domain name prefix (com|org|edu) # limit the allowed top-level domains ) >? # optional closing angle bracket ''', re.VERBOSE) candidates = [ u'First Last <first.last@example.com>', u'No Brackets first.last@example.com', u'Open Bracket <first.last@example.com', u'Close Bracket first.last@example.com>', ] for candidate in candidates: print('Candidate:', candidate) match = address.search(candidate) if match: print(' Name :', match.groupdict()['name']) print(' Email:', match.groupdict()['email']) else: print(' No match') 結果輸出如下:
Candidate: First Last <first.last@example.com> Name : First Last Email: first.last@example.comCandidate: No Brackets first.last@example.com Name : No Brackets Email: first.last@example.comCandidate: Open Bracket <first.last@example.com No matchCandidate: Close Bracket first.last@example.com> No match
python里使用正則表達式的前向搜索否定模式
上面學習前向搜索或后向搜索模式(?=pattern),這個模式里看到有等于號=,它是表示一定相等,其實前向搜索模式里,還有不相等的判斷。比如你需要識別EMAIL地址:noreply@example.com,這個EMAIL地址大多數是不需要回復的,所以我們要把這個EMAIL地址識別出來,并且丟掉它。怎么辦呢?這時你就需要使用前向搜索否定模式,它的語法是這樣:(?!pattern),這里的感嘆號就是表示非,不需要的意思。比如遇到這樣的字符串:noreply@example.com,它會判斷noreply@是否相同,如果相同,就丟掉這個模式識別,不再匹配。
|
新聞熱點
疑難解答