2012-05-26 34 views
2

從我算了一下,蟒蛇正則表達式 - 理解比賽之間的差異和搜索

match:給出一個字符串str和模式拍拍,匹配檢查,如果str 從STR的啓動模式相匹配。

search:給出一個字符串str和模式拍拍,搜索檢查,如果str 從海峽的各項指標的模式相匹配。

如果是這樣,在匹配的正則表達式開始時是否有使用'^'的含義? 從我的理解,因爲比賽已經從一開始就檢查,沒有。 我可能錯了,我的錯誤在哪裏?

謝謝!

+3

你讀過這個嗎? http://docs.python.org/library/re.html#search-vs-match。它解釋了一切。 – jamylak

回答

2

當調用函數re.match具體而言,^性格確實有,因爲這個功能在該行的開頭開始匹配過程有點意思。但是,它對re模塊中的其他函數確實有意義,並且在調用編譯的正則表達式對象時調用匹配。

例如:

text = """\ 
Mares eat oats 
and does eat oats 
""" 

print re.findall('^(\w+)', text, re.MULTILINE) 

此打印:

['Mares', 'and'] 

隨着re.findall()re.MULTILINE啓用,它可以讓你在你的文本的每一行的第一個字(不帶前導空格)。

如果要做更復雜的事情,比如使用正則表達式進行詞法分析,並將已編譯的正則表達式傳遞到應該在文本中開始匹配的起始位置(您可以選擇作爲結束位置)前一場比賽)。請參閱RegexObject.match方法的文檔。

簡單詞法分析程序/掃描器作爲一個例子:

text = """\ 
Mares eat oats 
and does eat oats 
""" 

pattern = r""" 
(?P<firstword>^\w+) 
|(?P<lastword>\w+$) 
|(?P<word>\w+) 
|(?P<whitespace>\s+) 
|(?P<other>.) 
""" 

rx = re.compile(pattern, re.MULTILINE | re.VERBOSE) 

def scan(text): 
    pos = 0 
    m = rx.match(text, pos) 
    while m: 
     toktype = m.lastgroup 
     tokvalue = m.group(toktype) 
     pos = m.end() 
     yield toktype, tokvalue 
     m = rx.match(text, pos) 

for tok in scan(text): 
    print tok 

它打印

('firstword', 'Mares') 
('whitespace', ' ') 
('word', 'eat') 
('whitespace', ' ') 
('lastword', 'oats') 
('whitespace', '\n') 
('firstword', 'and') 
('whitespace', ' ') 
('word', 'does') 
('whitespace', ' ') 
('word', 'eat') 
('whitespace', ' ') 
('lastword', 'oats') 
('whitespace', '\n') 

此區分類型字之間;一行開頭的單詞,一行末尾的單詞以及任何其他單詞。

2

在正常模式下,如果您使用的是匹配,則不需要^。 但是在多行模式下(re.MULTILINE),它可能很有用,因爲^不僅可以匹配整個字符串的開頭,還可以匹配每行的開頭。

+0

so re.MULTILINE在開始時沒有^沒有意義? – user1413824

+0

@ user1413824似乎是這樣,除了'$'也受到影響。根據Python文檔,所有're.MULTILINE'所做的就是改變'^'和'$' – chys

2

我相信沒有用。以下是複製/粘貼:http://docs.python.org/library/re.html#search-vs-match

python提供基於正則表達式兩種不同的基本操作:re.match()檢查只在字符串的開頭匹配,而re.search()檢查字符串的一場比賽中的任何地方(這是Perl默認做了什麼)。

例如:

>>> re.match("c", "abcdef") # No match 
>>> re.search("c", "abcdef") # Match 
<_sre.SRE_Match object at ...> 

'^'開始正則表達式可以用search()被用來在字符串的開頭來限制比賽:

>>> re.match("c", "abcdef") # No match 
>>> re.search("^c", "abcdef") # No match 
>>> re.search("^a", "abcdef") # Match 
<_sre.SRE_Match object at ...> 

不過請注意,在MULTILINE模式match()只匹配字符串的開始處,而使用search()以及以'^'開頭的正則表達式將在每行的開始處匹配。

>>> re.match('X', 'A\nB\nX', re.MULTILINE) # No match 
>>> re.search('^X', 'A\nB\nX', re.MULTILINE) # Match 
<_sre.SRE_Match object at ...> 
+0

的含義,所以在匹配的正則表達式開頭^是沒有意義的權利? – user1413824

+0

這個符號本身可以用於其他的東西,比如在'[^ \ w]'中,但是我看不到它用於檢查開始的任何用途。 – jamylak