python正则表达式错误:不平衡的括号

Jos*_*hna 5 python regex

我对python很新,所以我有一个包含一些键的字典和一个字符串.如果在字典中存在字典中存在的模式,我必须替换字符串.字典和字符串都非常大.我正在使用正则表达式来查找模式.

一切正常,直到像这样的键弹出' - ('或''( - )')在这种情况下python给出不平衡括号的错误.

以下是我编写的代码的外观:

somedict={'-(':'value1','(-)':'value2'}
somedata='this is some data containing -( and (-)'
for key in somedict.iterkeys():
    somedata=re.sub(key, 'newvalue', somedata)
Run Code Online (Sandbox Code Playgroud)

这是我在控制台中遇到的错误

Traceback (most recent call last):
  File "<console>", line 2, in <module>
  File "C:\Python27\lib\re.py", line 151, in sub
    return _compile(pattern, flags).sub(repl, string, count)
  File "C:\Python27\lib\re.py", line 244, in _compile
    raise error, v # invalid expression
error: unbalanced parenthesis
Run Code Online (Sandbox Code Playgroud)

我也尝试了很多方法使用正则表达式编译器并搜索了很多但没有找到任何解决问题的方法.任何帮助表示赞赏.

Mar*_*ers 10

您需要使用以下命令来转义密钥re.escape():

somedata = re.sub(re.escape(key), 'newvalue', somedata)
Run Code Online (Sandbox Code Playgroud)

否则内容将被解释为正则表达式.

你根本就没有使用正则表达式,所以你也可以使用:

somedata = somedata.replace(key, 'newvalue')
Run Code Online (Sandbox Code Playgroud)

如果你只想替换整个单词(所以在它们周围用空格或标点符号,在输入字符串的开头或结尾处),你需要某种边界锚点,这时使用正则表达式是有意义的.如果你只有字母数字(加上下划线),\b那就行了:

somedata = re.sub(r'\b{}\b'.format(re.escape(key)), 'newvalue', somedata)
Run Code Online (Sandbox Code Playgroud)

这使得\b之前,你想替换字符串后,使baz在foo baz bar改变,但是foo bazbaz bar是不是.

对于涉及非字母数字"单词"的输入,您需要使用前瞻和后视来匹配空白或开始和空白或结束锚点:

somedata = re.sub(r'(?:^|(?<=\s)){}(?:$|(?=\s))'.format(re.escape(key)), 'newvalue', somedata)
Run Code Online (Sandbox Code Playgroud)

这里的模式(?:^|(?<=\s))使用两个锚点,即字符串开始锚点和后面的断言,以匹配字符串开头或左边空格的位置.同样(?:$|(?=\s),另一端也是如此,匹配字符串的末尾或后跟空格的位置.