簡體   English   中英

如何在 Python 中轉義反斜杠和單引號或雙引號?

[英]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.

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