問:
我已經(jīng)閱讀了現(xiàn)有的相關(guān)文檔,但是我總是記不住,碰到類似的問題,我還要不斷地查找再學(xué)習(xí),我希望某個大神能夠給個清晰的案例,讓我能夠很好的記住,或者至少能夠在Stackoverflow上有個地方能夠讓我再學(xué)習(xí)的時候方便地找到。
答:
re.match位于字符串的開頭。它與新行無關(guān),因此它在模式上與^的用法不同。
正如re.match文檔所說:
如果在字符串的開頭有0個或更多個字符符合正則表達(dá)式模式,返回相關(guān)匹配的實例對象,如果字符串不符合正則表達(dá)式模式則返回None,注意這個跟0長度的匹配是有區(qū)別的。注:如果你想要在字符串中定位任意一個匹配位置的話,請轉(zhuǎn)用search()。
re.search搜索整個字符串,正如re.search文檔所說:
掃描整個字符串,如果產(chǎn)生了一個匹配正則模式就尋找到這個位置,返回相關(guān)匹配的對象。如果沒有位置能夠匹配這個模式則返回None.(注意這個跟在字符的某處有0長度的匹配是有區(qū)別的。)
所以,如果你想要從字符串的一開始就進(jìn)行匹配或匹配整個字符串的話就使用match。它更加快速,否則請使用search。
該文檔有個專門的章節(jié)講述match和search同樣覆蓋了多行字符串:
Python根據(jù)正則表達(dá)式提供兩種不同的基本操作:match只在字符串的開頭確認(rèn)一個匹配,而search在字符串的任何匹配的位置都確認(rèn)(Perl默認(rèn)就是這么設(shè)置的)。
注意即使在使用以開始的正則表達(dá)式時match也可能不同于search:只在字符串的開頭匹配,或在多行模式立刻緊跟的一個新行。不管出于什么模式,match操作只有在一開始字符串匹配的情況下能夠成功,或者在可選參數(shù)pos給定的開始位置(不管在這之前有沒有新行)。
概念說的足夠多了,下面給大家上些例子:
string_with_newlines = """something
someotherthing"""
import re
print re.match('some', string_with_newlines) # matches
print re.match('someother', string_with_newlines) # won't match
print re.match('^someother', string_with_newlines, re.MULTILINE) # also won't match
print re.search('someother', string_with_newlines) # finds something
print re.search('^someother', string_with_newlines, re.MULTILINE) # also finds something
m = re.compile('thing$', re.MULTILINE)
print m.match(string_with_newlines) # no match
print m.match(string_with_newlines, pos=4) # matches
print m.search(string_with_newlines,re.MULTILINE) # also matches
譯者注:
- re.match() 從第一個字符開始找, 如果第一個字符就不匹配就返回None, 不繼續(xù)匹配. 用于判斷字符串開頭或整個字符串是否匹配,速度快.
- re.search() 會整個字符串查找,直到找到一個匹配。
- re.MULTILINE 匹配多行模式。
原文:Stackoverflow問題
What is the difference between Python's re.search and re.match?