[英]Looking for difference between re.match(pattern, …) and re.search(r'\A' + pattern, …)
(以下所有代碼都假設已經評估了import re
的上下文。)
關於re.match
和re.search
之間差異的文檔專門比較了運行re.match(pattern, ...)
和運行re.search('^' + pattern, ...)
。 這在我看來有點像一個稻草人,因為真正的測試是將re.match(pattern, ...)
與re.search(r'\\A' + pattern, ...)
1進行比較 。
更具體地說,我不能隨便想出一個pattern
和string
的組合,其結果
m = re.match(pattern, string)
將與結果不同
m = re.search(r'\A' + pattern, string)
(注意,如果在原來的圖案pattern
恰好是類型的unicode
,所以是在訂正圖案r'\\A' + pattern
,方便地足夠。)
我要強調的是,在這里我對性能,便利性等方面的可能差異不感興趣。目前我只關注最終結果的差異(即m
的最終值的差異)。
為了更一般地說一下這個問題,我正在尋找pattern
, flags
, string
和kwargs
的組合,以便m
的最終值
r0 = re.compile(pattern, flags=flags)
m = r0.match(string, **kwargs)
與m
in的最終值不同
r1 = re.compile(r'\A' + pattern, flags=flags)
m = r1.search(string, **kwargs)
可能沒有輸入pattern
, flags
, string
和kwargs
這種組合,但是為了能夠有信心地進行這種斷言,需要深入了解Python的正則表達式引擎的內部結構。 IOW,與“肯定答案”(即僅由一個如上所述的輸入組合組成的答案)形成對比,對這個問題的“否定答案”相當於一個相當權威的陳述,因此要令人信服,要求案例是在更深層次上(比“積極”答案)。
總結一下:我正在尋找兩種可能的答案之一:
pattern
, flags
, string
和kwargs
的組合,在上面給出的最后兩種情況下將產生不同的m
值; 1 \\A
將匹配錨定到字符串的開頭,而不管匹配是否為多行。 順便說一下,字符串結尾匹配的\\A
對應是\\Z
令人討厭的是,Python的\\Z
對應於Perl的\\z
,而不是 Perl的\\Z
當我寫這篇文章的早期版本時,這讓我感到沮喪。 (順便說一句,在Python regexes \\z
中沒有特殊含義;它只匹配z
。)感謝John Y發現我的錯誤。
可能有一些我在這里看不到的東西,但我認為區別很明顯。
re.match()
僅在您要查找的模式位於字符串的開頭時返回成功匹配,並且從文檔中的示例外觀看起來re.match()
使用\\A
來錨定匹配項到字符串的開頭而不是多行模式的行首。
只要有匹配, re.search()
返回一個成功的匹配, 無論模式在目標字符串中的哪個位置,當然只要你沒有故意錨定模式。
現在回答你的主要問題,關於re.match(pattern, …)
和re.search(r'\\A' + pattern, …)
之間的區別是什么?
好吧沒有任何區別,它只是一個方便的方法,所以你不必每次輸入r'\\A' + pattern
我想如果你想錨定你的匹配,我認為發生了很多。
您可以更加確定re.match()
\\A
內部使用\\A
只需查看您發布的比較鏈接中的最后一個示例:
>>> re.match('X', 'A\nB\nX', re.MULTILINE) # No match
>>> re.search('^X', 'A\nB\nX', re.MULTILINE) # Match
<_sre.SRE_Match object at ...>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.