我有一个这样的字符串:
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
我知道我在这里错过了一些东西......
答案 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\\)'