簡體   English   中英

如何使用 re.search 搜索作為轉義序列的字符串

[英]How to search for a character string that is an escape sequence with re.search

我編寫了代碼來檢查字符串中是否包含轉義序列“\n”。 但是,它的行為出乎意料,所以我想知道原因。 為什么我得到的是case2的結果?

情況1

下面的代碼有效。 由於r"\n" (reg1) 是由'\''n'兩個字符組成的字符串,我認為搜索並匹配目標字符串"\n"是正確的。

import re
reg1 = r"\n"
print (re.search (reg1, "\n"))
#output: <re.Match object; span = (0, 1), match ='\n'>

案例二

下面的代碼期望 output 為 None,但它沒有。 由於轉義序列的換行符"\n" (reg2)被用作模式,而由兩個字符'\''n' "\n"組成的“\n”被用作目標字符串,認為它們不匹配。 然而,它確實匹配了。

import re
reg2 = "\n"
print (re.search (reg2, "\n"))
#output: <re.Match object; span = (0, 1), match ='\n'>

當涉及到用於正則表達式而不是目標的字符串的內容時,您是正確的。 該聲明:

"\n"由兩個字符組成, '\''n' ,用作目標字符串,

是不正確的。 字符串的解釋與上下文無關; r"\n"總是 2 個字符,而"\n"總是 1 個。這在Python Regular Expression HOWTO中有介紹:

r"\n"是一個包含'\''n'的雙字符字符串,而"\n"是一個包含換行符的單字符字符串。

使用非控制字符更容易證明這一點,因為文字“\n”會寫成:

你明白了嗎? 讓我們改用“þ”(刺)。

情況1:

re.search(r"\u00FE", "\u00FE")

r"þ"是一個包含 6 個字符的字符串,可編譯為正則表達式/þ/ 這被正則表達式庫本身解釋為與刺字符匹配的轉義序列。

"þ"由 python 解釋,生成字符串"þ"

/þ/匹配"þ"

案例二:

re.search("\u00FE", "\u00FE")

"þ"是一個包含 1 個字符“þ”的字符串,它編譯為正則表達式/þ/

/þ/匹配"þ"

結果:兩個正則表達式匹配。 唯一的區別是正則表達式在情況 1 中包含轉義序列,在情況 2 中包含字符文字。

您似乎想到的是目標的原始字符串:

re.search(r"\u00FE", r"\u00FE")
re.search("\u00FE", r"\u00FE")

這些都不匹配,因為兩個目標都不包含刺字符。

如果要匹配轉義序列,轉義字符必須在正則表達式中轉義:

re.search(r"\\u00FE", r"\u00FE")
re.search("\\\\u00FE", r"\u00FE")

這些模式中的任何一個都會產生正則表達式/\þ/ ,它匹配包含給定轉義序列的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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