如何找到匹配项并使用RegEx进行更新?

时间:2015-03-10 06:56:03

标签: python regex string

我有一个字符串

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

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

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

到目前为止我所做的是找到字符串中的所有特殊字符,除了空白和使用

的双引号
re.findall(r'[^\w" ]',a)

现在,一旦我找到所有必需的特殊字符,我想更新字符串。我甚至试过re.sub但它取代了特殊字符。无论如何我能做到吗?

2 个答案:

答案 0 :(得分:3)

使用re.escape

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

re.escape(字符串)

     

返回字符串,所有非字母数字反向;如果要匹配可能包含正则表达式元字符的任意文字字符串,这非常有用。

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中的反斜杠+字符替换匹配的字符将为您提供所需的输出。

答案 1 :(得分:3)

您似乎可以使用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,即第一个参数中括号中捕获的模式。

换句话说,除了:

之外,它将逃脱一切
  • 字母数字字符
  • 下划线
  • 双引号
  • 空间