用Python替换空格和元字符

时间:2013-03-13 14:04:48

标签: python regex

我有一个这样的字符串:

str1 = "/path/happy (dog)"

出于某种目的,我希望它像:

str2 = "/path/happy\ \(dog\)"

我尝试使用re:

str1 = "happy (dog)"
tuple_1 = ('\s+','(',')')


for i in tuple_1:

   match = re.search(r"("+i+")",str1)

   if match:
      str1 = re.sub(match.group(),"\\"+match.group(),str1)

print str1

但它给出了错误:

sre_constants.error: unbalanced parenthesis

我知道我在这里错过了一些东西......

3 个答案:

答案 0 :(得分:2)

您需要转义任何特殊字符,例如括号:

tuple_1 = (r'\s+', r'\(', r'\)')

否则它们将被解释为正则表达式字符。

答案 1 :(得分:2)

当我是'('结果正则表达式将是'(()'。两个开括号和一个结束。因此错误信息“不平衡的括号”。

您必须转义tuple_1中的两个括号:

tuple_1 = (r'\s+', r'\(', r'\)')

答案 2 :(得分:1)

即使您应用其他答案提到的更改(转义元组中的搜索字词),这是有效且重要的,您仍然可以获得

Traceback (most recent call last):
  File "<pyshell#4>", line 6, in <module>
    str1 = re.sub(match.group(),"\\"+match.group(),str1)
error: unbalanced parenthesis

但这次是在另一条线上。因此,当您使用regex's sub function时,第一个参数需要是有效的正则表达式。 match.group()可以是任何东西,并不一定是平衡的。这就是正则表达式窒息的地方。因此,我们可以从match.group()escape it中获取字符串,因此我们正在搜索字面值。从而将线路改为

str1 = re.sub(re.escape(match.group()),"\\"+match.group(),str1)

另一方面,我们可以只编译一次模式,并记住它 所以

pattern = re.compile(r"("+i+")")
str1 = re.sub(pattern,"\\"+match.group(),str1)

最终代码是:

str1 = "/path/happy (dog)"
tuple_1 = (r'\s+', r'\(', r'\)')
for i in tuple_1:
     pattern = re.compile(r"("+i+")")

     match = pattern.search(str1)

     if match:
         str1 = re.sub(pattern,"\\"+match.group(),str1)

str1现在是'/path/happy\\ \\(dog\\)'