亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對正則表達式中的反斜杠感到困惑

對正則表達式中的反斜杠感到困惑

倚天杖 2019-08-05 15:25:53
對正則表達式中的反斜杠感到困惑我對正則表達式中的反斜杠感到困惑。在正則表達式中,a \具有特殊含義,例如,\d表示十進制數字。如果在反斜杠前添加反斜杠,則此特殊含義會丟失。在正則表達式中,人們可以閱讀:也許最重要的元字符是反斜杠,\。與Python字符串文字一樣,反斜杠后面可以跟各種字符,以指示各種特殊序列。它也用于轉義所有元字符,因此您仍然可以在模式中匹配它們; 例如,如果你需要匹配一個[或者\,你可以在它們前面加一個反斜杠來刪除它們的特殊含義:\[或者\\。所以print(re.search('\d', '\d'))給出None因為\d匹配任何十進制數字,但沒有\d。我現在期望print(re.search('\\d', '\d'))匹配,\d但答案仍然是None。僅print(re.search('\\\d', '\d'))給出輸出<_sre.SRE_Match object; span=(0, 2), match='\\d'>。有人有解釋嗎?
查看完整描述

3 回答

?
largeQ

TA貢獻2039條經驗 獲得超8個贊

混淆是因為反斜杠字符\在兩個不同的級別用作轉義。首先,Python解釋器本身\re模塊看到你的字符串之前執行替換。例如,\n轉換為換行符,\t轉換為制表符等。要獲得實際\角色,您也可以將其轉義,因此只\\需要一個\字符。如果后面的字符\不是可識別的轉義字符,那么它將\被視為任何其他字符并通過,但我不建議依賴于此。相反,總是\通過加倍來逃避你的角色,即\\。

如果你想看看Python如何擴展你的字符串轉義,只需打印出字符串。例如:

s = 'a\\b\tc'print s

如果s是聚合數據類型的一部分,例如列表或元組,并且如果打印該聚合,Python將用單引號括起該字符串并包含\轉義(以規范形式),因此請注意字符串的方式正在印刷。如果您只是在解釋器中鍵入帶引號的字符串,它也會將其顯示在帶有'\'轉義符的引號中。

一旦你知道你的字符串是如何被編碼的,你就可以考慮re模塊將用它做什么。例如,如果要\在傳遞給re模塊的字符串中轉義,則需要傳遞\\re,這意味著您需要\\\\在引用的Python字符串中使用。Python的字符串將結束與\\re模塊將其視為一個單一的文字\字符。

\在Python字符串中包含字符的另一種方法是使用原始字符串,例如r'a\b'相當于"a\\b"。


查看完整回答
反對 回復 2019-08-05
?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

在對search()的調用中,正則表達式之前的r字符指定正則表達式是原始字符串。這允許反斜杠在正則表達式中用作常規字符,而不是在轉義字符序列中。讓我解釋 ...

在re模塊的搜索方法處理傳遞給它的字符串之前,Python解釋器對字符串進行初始傳遞。如果字符串中存在反斜杠,則Python解釋器必須確定每個是否是Python轉義序列的一部分(例如\ n或\ t)。

注意:此時Python并不關心'\'是否是正則表達式元字符。

如果'\'后跟一個識別的Python轉義字符(t,n等),則反斜杠和轉義字符將替換為實際的Unicode或8位字符。例如,'\ t'將替換為選項卡的ASCII字符。否則它被傳遞并解釋為'\'字符。

考慮以下。

>>> s = '\t'>>> print ("[" + s  + "]")>>> [       ]           // an actual tab character after preprocessing>>> s = '\d'>>> print ("[" + s  + "]")>>> [\d]                // '\d' after preprocessing

有時我們希望在字符串中包含一個包含'\'的字符序列,而不會被Python解釋為轉義序列。要做到這一點,我們用'\'來逃避'\'?,F在,當Python看到'\'時,它會用一個'\'字符替換兩個反斜杠。

>>> s = '\\t'>>> print ("[" + s  + "]")>>> [\t]                // '\t' after preprocessing

在Python解釋器對兩個字符串進行傳遞后,它們將傳遞給re模塊的搜索方法。搜索方法解析正則表達式字符串以標識正則表達式的元字符。

現在'\'也是一個特殊的正則表達式元字符,并且被解釋為一個UNLESS,它在執行re search()方法時被轉義。

考慮以下電話。

>>> match = re.search('a\\t','a\\t')        //Match is None

這里匹配是None。為什么?讓我們看看Python解釋器傳遞后的字符串。

String 1: 'a\t'String 2: 'a\t'

那么為什么匹配等于None?當search()解釋String 1時,由于它是正則表達式,因此反斜杠被解釋為元字符,而不是普通字符。但是,字符串2中的反斜杠不在正則表達式中,并且已由Python解釋器處理,因此它被解釋為普通字符。

所以search()方法在字符串'a \ t'中尋找'a escape-t',它們不匹配。

為了解決這個問題,我們可以告訴search()方法不要將'\'解釋為元字符。我們可以通過逃避它來做到這一點。

考慮以下電話。

>>> match = re.search('a\\\\t','a\\t')          // Match contains 'a\t'

再次,讓我們看看Python解釋器傳遞后的字符串。

String 1: 'a\\t'String 2: 'a\t'

現在,當search()方法處理正則表達式時,它會看到第二個反斜杠被第一個反斜杠轉義,不應該被視為元字符。因此,它將字符串解釋為'a \ t',它與String 2匹配。

將search()視為'\'作為字符的另一種方法是在正則表達式之前放置一個r。這告訴Python解釋器不要預處理字符串。

考慮一下。

>>> match = re.search(r'a\\t','a\\t')           // match contains 'a\t'

這里的Python解釋器不會修改第一個字符串,但會處理第二個字符串。傳遞給search()的字符串是:

String 1: 'a\\t'String 2: 'a\t'

與前面的示例一樣,搜索將'\'解釋為單個字符'\'而不是元字符,因此與字符串2匹配。


查看完整回答
反對 回復 2019-08-05
  • 3 回答
  • 0 關注
  • 1689 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號