簡體   English   中英

尋找re.match(pattern,...)和re.search(r'\\ A'+ pattern,...)之間的區別

[英]Looking for difference between re.match(pattern, …) and re.search(r'\A' + pattern, …)

(以下所有代碼都假設已經評估了import re的上下文。)

關於re.matchre.search之間差異的文檔專門比較了運行re.match(pattern, ...)和運行re.search('^' + pattern, ...) 這在我看來有點像一個稻草人,因為真正的測試是將re.match(pattern, ...)re.search(r'\\A' + pattern, ...) 1進行比較

更具體地說,我不能隨便想出一個patternstring的組合,其結果

m = re.match(pattern, string)

將與結果不同

m = re.search(r'\A' + pattern, string)

(注意,如果在原來的圖案pattern恰好是類型的unicode ,所以是在訂正圖案r'\\A' + pattern ,方便地足夠。)

我要強調的是,在這里我對性能,便利性等方面的可能差異感興趣。目前我只關注最終結果的差異(即m的最終值的差異)。

為了更一般地說一下這個問題,我正在尋找patternflagsstringkwargs的組合,以便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)

可能沒有輸入patternflagsstringkwargs這種組合,但是為了能夠有信心地進行這種斷言,需要深入了解Python的正則表達式引擎的內部結構。 IOW,與“肯定答案”(即僅由一個如上所述的輸入組合組成的答案)形成對比,對這個問題的“否定答案”相當於一個相當權威的陳述,因此要令人信服,要求案例是在更深層次上(比“積極”答案)。

總結一下:我正在尋找兩種可能的答案之一:

  1. patternflagsstringkwargs的組合,在上面給出的最后兩種情況下將產生不同的m值;
  2. 基於Python正則表達式內部知識,權威的“否定”答案(即不存在這樣的輸入組合)。

1 \\A將匹配錨定到字符串的開頭,而不管匹配是否為多行。 順便說一下,字符串結尾匹配的\\A對應是\\Z 令人討厭的是,Python的\\Z對應於Perl的\\z ,而不是 Perl的\\Z 當我寫這篇文章的早期版本時,這讓我感到沮喪。 (順便說一句,在Python regexes \\z中沒有特殊含義;它只匹配z 。)感謝John Y發現我的錯誤。

可能有一些我在這里看不到的東西,但我認為區別很明顯。

  1. re.match() 在您要查找的模式位於字符串的開頭時返回成功匹配,並且從文檔中的示例外觀看起來re.match()使用\\A來錨定匹配項到字符串的開頭而不是多行模式的行首。

  2. 只要有匹配, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM