【问题标题】:How can I find a match and update it with RegEx?如何找到匹配项并使用 RegEx 对其进行更新?
【发布时间】:2015-03-10 06:56:03
【问题描述】:

我有一个字符串

a = "hello i am stackoverflow.com user +-"

现在我想转换字符串中除引号和空格之外的转义字符。所以我的预期输出是:

a = "hello i am stackoverflow\.com user \+\-"

到目前为止,我所做的是使用

查找字符串中除空格和双引号之外的所有特殊字符
re.findall(r'[^\w" ]',a)

现在,一旦我找到了所有必需的特殊字符,我就想更新字符串。我什至尝试过re.sub,但它替换了特殊字符。反正我能做到吗?

【问题讨论】:

  • 除了答案之外,像re.sub(r'([\.+-])', r'\\\1', a) 这样简单的东西也会产生您预期的输出。
  • @jedwards Dang,我为什么没想到...你为什么不反转正则表达式并将其作为答案发布?
  • @thefourtheye 仅适用于上述输入。检查我的第二个答案..
  • @AvinashRaj 你的意思是说re.sub(r'([^\w" ])', r'\\\1', a) 行不通?
  • 这是个好主意。起初我认为 re.escape 只会逃避一些特定的角色。但它会转义所有非单词字符。

标签: python regex string


【解决方案1】:

使用re.escape

>>> a = "hello i am stackoverflow.com user +-"
>>> print(re.sub(r'\\(?=[\s"])', r'', re.escape(a)))
hello i am stackoverflow\.com user \+\-

重新转义(字符串)

返回所有非字母数字反斜杠的字符串;如果您想匹配其中可能包含正则表达式元字符的任意文字字符串,这将非常有用。

r'\\(?=[\s"])' 匹配在空格或双引号之前存在的所有反斜杠。用空字符串替换匹配的反斜杠将为您提供所需的输出。

>>> a = 'hello i am stackoverflow.com user "+-'
>>> print(re.sub(r'((?![\s"])\W)', r'\\\1', a))
hello i am stackoverflow\.com user "\+\-

((?![\s"])\W) 捕获所有非单词字符,但不捕获空格或双引号。用组索引 1 内的反斜杠 + 字符替换匹配的字符将为您提供所需的输出。

【讨论】:

    【解决方案2】:

    您似乎可以使用 re.sub 的反向引用来实现您想要的输出:

    import re
    
    a = "hello i am stackoverflow.com user +-"
    
    print re.sub(r'([^\w" ])', r'\\\1', a)   # hello i am stackoverflow\.com user \+\-
    

    替换模式r'\\\1' 只是\\,表示文字反斜杠,后跟\1,表示捕获组1,即第一个参数括号中捕获的模式。

    换句话说,它会转义除了:

    • 字母数字字符
    • 下划线
    • 双引号
    • 空间

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 1970-01-01
      • 2020-06-16
      • 2022-09-28
      • 2013-01-29
      • 1970-01-01
      • 2020-10-24
      • 2011-08-02
      相关资源
      最近更新 更多