從我算了一下,蟒蛇正則表達式 - 理解比賽之間的差異和搜索
match
:給出一個字符串str和模式拍拍,匹配檢查,如果str 從STR的啓動模式相匹配。
search
:給出一個字符串str和模式拍拍,搜索檢查,如果str 從海峽的各項指標的模式相匹配。
如果是這樣,在匹配的正則表達式開始時是否有使用'^'
的含義? 從我的理解,因爲比賽已經從一開始就檢查,沒有。 我可能錯了,我的錯誤在哪裏?
謝謝!
從我算了一下,蟒蛇正則表達式 - 理解比賽之間的差異和搜索
match
:給出一個字符串str和模式拍拍,匹配檢查,如果str 從STR的啓動模式相匹配。
search
:給出一個字符串str和模式拍拍,搜索檢查,如果str 從海峽的各項指標的模式相匹配。
如果是這樣,在匹配的正則表達式開始時是否有使用'^'
的含義? 從我的理解,因爲比賽已經從一開始就檢查,沒有。 我可能錯了,我的錯誤在哪裏?
謝謝!
當調用函數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')
此區分類型字之間;一行開頭的單詞,一行末尾的單詞以及任何其他單詞。
在正常模式下,如果您使用的是匹配,則不需要^。 但是在多行模式下(re.MULTILINE
),它可能很有用,因爲^不僅可以匹配整個字符串的開頭,還可以匹配每行的開頭。
so re.MULTILINE在開始時沒有^沒有意義? – user1413824
@ user1413824似乎是這樣,除了'$'也受到影響。根據Python文檔,所有're.MULTILINE'所做的就是改變'^'和'$' – chys
我相信沒有用。以下是複製/粘貼: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 ...>
的含義,所以在匹配的正則表達式開頭^是沒有意義的權利? – user1413824
這個符號本身可以用於其他的東西,比如在'[^ \ w]'中,但是我看不到它用於檢查開始的任何用途。 – jamylak
你讀過這個嗎? http://docs.python.org/library/re.html#search-vs-match。它解釋了一切。 – jamylak