0

我有一个这样的字符串:

str1 = "/path/happy (dog)"

出于某种目的,我想要它:

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

我尝试使用重新:

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

我知道我在这里遗漏了一些东西......

4

3 回答 3

2

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

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

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

于 2013-03-13T14:06:27.327 回答
2

当 i 是 '(' 时,生成的正则表达式将是 '(()'。两个左括号和一个右括号。因此错误消息“不平衡括号”。

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

tuple_1 = (r'\s+', r'\(', r'\)')
于 2013-03-13T14:10:00.610 回答
1

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

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

但这次在不同的路线上。所以当你使用正则表达式的子函数时,第一个参数需要是一个有效的正则表达式。match.group()可以是任何东西,不一定是平衡的。这是正则表达式令人窒息的地方。因此,我们可以从中获取字符串match.group()并将其转义,因此我们正在搜索文字。从而将线路更改为

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\\)'

于 2013-03-13T15:22:44.760 回答