【问题标题】:Python re.sub to remove single quotes AND double quotes from stringPython re.sub 从字符串中删除单引号和双引号
【发布时间】:2021-02-26 22:14:11
【问题描述】:

这是一个很快让我发疯的问题。我想从字符串中同时删除 ' 和 " 字符。我想使用 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) 是正确的说法吗?你能帮我理解发生了什么吗?

【问题讨论】:

    标签: python regex string re rawstring


    【解决方案1】:

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

    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' 引用回捕获组 1,而'\1' 将匹配 '\x01'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      相关资源
      最近更新 更多