Python re.sub 从字符串中删除单引号和双引号

Python re.sub to remove single quotes AND double quotes from string

这是一个很快让我抓狂的问题。我想从字符串中删除 ' 和 " 字符。我想用 re.sub 来做(因为我想比较 re.sub 和 str.replace 所以我想同时做方式)。现在我对原始字符串的理解是转义字符被视为文字,除非它们正在转义打开字符串的字符。所以我有两个关于如何做到这一点的想法:

# Method 1: concatenate strings that have different enclosing characters
>>> REGEX1 = re.compile(r"[" + r'"' + r"'" + r"]")
>>> REGEX1.pattern
'["\']'
# Method 2: Try to escape one of the quotation characters
>>> REGEX2= re.compile(r"[\"']")
>>> REGEX2.pattern
'[\"\']'

给出的图案看起来不一样。他们是吗?我测试它们在正则表达式中的行为是否相同:

>>> test_string = "hello ' world \" "
>>> test_string
'hello \' world " '
>>> result_1 = REGEX1.sub(r'', test_string)
>>> result_2 = REGEX2.sub(r'', test_string)
>>> result_1
'hello  world  '
>>> result_2
'hello  world  '
>>> 

我的直觉告诉我以下两种情况之一是可能的:

  1. '["']' == '[\"']'
  2. '["']' != '[\"']',但当作为正则表达式处理时,其行为等效。

最后一个测试:

>>> '["\']' == '[\"\']'                                                                                                                                                                                      
False

那么上面的2)是正确的说法吗?你能帮我了解发生了什么吗?

当您显示它们的值时,它们看起来不同,但就被解释为正则表达式而言,它们是等价的:

import re


REGEX1 = re.compile(r"[" + r'"' + r"'" + r"]")
print(REGEX1.pattern)
print(REGEX1.sub('', """abc"'def"""))
REGEX2= re.compile(r"[\"']")
print(REGEX2.pattern)
print(REGEX2.sub('', """abc"'def"""))

打印:

["']
abcdef
[\"']
abcdef 

说明

原始字符串 r'\n' 和非原始字符串 '\n' 之间的区别是巨大的,因为后者是一个特殊的转义序列,相当于换行符,而前者相当于 '\n',即反斜杠后跟字母 n 的两个字符序列。但是对于其他情况,例如 '\",其中反斜杠后跟双引号不是特殊的转义序列,那么反斜杠是多余的,可以忽略,因此 ["'][\"'] 是相当于.

更新

由于我指出当反斜杠后面的内容在反斜杠后面具有特殊含义时(例如 r'\n''\n'),对于正则表达式的所有意图和目的而言,情况并非总是如此。例如,在正则表达式中使用时,Python 正则表达式引擎会将换行符与从双字符序列 r'\n'(即 '\n')编译的正则表达式相匹配或换行符 '\n':

import re


REGEX1 = re.compile('a\nb') # use actual newline
print('pattern1 = ', REGEX1.pattern)
print(REGEX1.search('a\nb'))
REGEX2 = re.compile(r'a\nb') # use '\n'
print('pattern 2 =', REGEX2.pattern)
print(REGEX2.search('a\nb'))

打印:

pattern1 =  a
b
<re.Match object; span=(0, 3), match='a\nb'>
pattern 2 = a\nb
<re.Match object; span=(0, 3), match='a\nb'>

但通常会使用原始字符串,因为在某些情况下您可能需要,例如,r'' 返回捕获组 1 并且 '' 会匹配 '\x01'