[英]How do I escape backslash and single quote or double quote in Python?
如何在 Python 中轉義反斜杠和單引號或雙引號?
例如:
Long string = '''some 'long' string \' and \" some 'escaped' strings'''
value_to_change = re.compile(A EXPRESION TO REPRESENT \' and \")
modified = re.sub(value_to_change, 'thevalue', Long_string)
## Desired Output
modified = '''some 'long' string thevalue and thevalue some 'escaped' strings'''
如果您的“長字符串”是從文件中讀取的(正如您在評論中提到的那樣),那么您的問題具有誤導性。 由於您顯然不完全了解 escaping 的工作原理,因此您寫下的問題可能與您真正遇到的問題不同。
如果這些是您的文件的內容(如圖所示的 51 個字節 + 可能是一到兩個行尾字符):
some 'long' string \' and \" some 'escaped' strings
那么這就是它在 python 中的樣子:
>>> s1 = open('data.txt', 'r').read().strip()
>>> s1
'some \'long\' string \\\' and \\" some \'escaped\' strings'
>>> print s1
some 'long' string \' and \" some 'escaped' strings
您在問題中寫的內容將產生:
>>> s2 = '''some 'long' string \' and \" some 'escaped' strings'''
>>> s2
'some \'long\' string \' and " some \'escaped\' strings'
>>> print s2
some 'long' string ' and " some 'escaped' strings
>>> len(s)
49
你看得到差別嗎?
s2 中沒有反斜杠,因為當您使用它們在 Python 中寫下字符串時,它們具有特殊含義。 當您從文件中讀取它們時,它們沒有特殊含義。
如果你想寫下一個后面有反斜杠的字符串,你必須保護你輸入的反斜杠。 您必須防止 Python 認為它具有特殊含義。 你可以通過 escaping 來做到這一點 - 使用反斜杠。
一種方法是使用反斜杠,但通常更容易且不易混淆的方法是使用原始字符串:
>>> s3 = r'''some 'long' string \' and \" some 'escaped' strings'''
'some \'long\' string \\\' and \\" some \'escaped\' strings'
>>> print s3
some 'long' string \' and \" some 'escaped' strings
>>> s1 == s3
True
以上只是為了向您表明您的問題令人困惑。
實際的答案有點難——當您使用正則表達式時,反斜杠具有另一層特殊含義。 如果您想通過字符串 escaping 和正則表達式 escaping 安全地獲得反斜杠到實際的正則表達式,則必須相應地寫下多個反斜杠。
此外,將單引號 ( '
) 放在單引號原始字符串 ( r''
) 中的規則也有點棘手,因此我將使用帶有三個單引號 ( r''''''
) 的原始字符串。
>>> print re.sub(r'''\\['"]''', 'thevalue', s1)
some 'long' string thevalue and thevalue some 'escaped' strings
這兩個反斜杠在整個字符串 escaping 中保持兩個反斜杠,然后通過正則表達式 escaping 成為一個沒有特殊含義的反斜杠。 總的來說,正則表達式說:“匹配一個反斜杠,后跟一個單引號或一個雙引號。”
現在來看看 pièce de résistance:前一個確實很好地說明了 jwz 的含義1 。 如果您忘記了正則表達式(並且知道原始字符串),那么解決方案就會變得更加明顯:
>>> print s1.replace(r'\"', 'thevalue').replace(r"\'", 'thevalue')
some 'long' string thevalue and thevalue some 'escaped' strings
1有些人在遇到問題時會想“我知道,我會使用正則表達式”。 現在他們有兩個問題。
這是你想要的嗎?
import re
Long_string = "some long string \' and \" some escaped strings"
value_to_change = re.compile( "'|\"" )
modified = re.sub(value_to_change , 'thevalue' , Long_string )
print modified
請記住,所有這些字符串都是完全相同的:
Long_string = '''some long string \' and \" some escaped strings'''
Long_string = '''some long string ' and " some escaped strings'''
Long_string = """some long string ' and " some escaped strings"""
Long_string = 'some long string \' and \" some escaped strings'
Long_string = "some long string \' and \" some escaped strings"
Long_string = 'some long string \' and " some escaped strings'
Long_string = "some long string ' and \" some escaped strings"
其中任何一個都沒有反斜杠字符。 所以你正在尋找的正則表達式不需要匹配反斜杠和引號,只需一個引號:
modified = re.sub("['\"]", 'thevalue', Long_string)
順便說一句:您也不必在使用正則表達式之前對其進行編譯,re.sub 將接受字符串正則表達式以及已編譯的正則表達式。
問題是在您的字符串中 \' 和 \" 被轉換為 ' 和 ",因此在您的示例中,如果不匹配long周圍的單引號,您將無法僅匹配 \' 。
但我的理解是這些數據來自一個文件,所以假設你有 your_file.txt 包含
some 'long' string \' and \" some 'escaped' strings
您可以用以下代碼替換 \' 和 \" :
import re
from_file = open("your_file.txt", "r").read()
print(re.sub("\\\\(\"|')", "thevalue", from_file))
注意四個斜線。 由於這是一個字符串 \ 被轉換為 \ (因為這是一個轉義字符)。 然后在正則表達式中,剩余的 \ 再次轉換為 \,因為這也是正則表達式轉義字符。 結果將匹配單個斜杠和 " 和 ' 引號之一。
我嘗試這樣打印一個反斜杠(Python 3):
single_backslash_str = r'\ '[0]
print('single_backslash_str') #output: \
print('repr(single_backslash_str)') #output: '\\'
希望這會有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.