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 '
>>>
我的直觉告诉我以下两种情况之一是可能的:
- '["']' == '[\"']'
- '["']' != '[\"']',但当作为正则表达式处理时,其行为等效。
最后一个测试:
>>> '["\']' == '[\"\']'
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'
。
这是一个很快让我抓狂的问题。我想从字符串中删除 ' 和 " 字符。我想用 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 '
>>>
我的直觉告诉我以下两种情况之一是可能的:
- '["']' == '[\"']'
- '["']' != '[\"']',但当作为正则表达式处理时,其行为等效。
最后一个测试:
>>> '["\']' == '[\"\']'
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'
。