Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正则表达式错误:不平衡括号_Python_Regex - Fatal编程技术网

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

python正则表达式错误:不平衡括号,python,regex,Python,Regex,我对python很陌生,所以我有一本字典,里面有一些键,还有一个字符串。如果字符串中存在字典中找到的模式,我必须替换该字符串。字典和字符串都很大。我用正则表达式来寻找模式 这一切都可以正常工作,直到像这样的键弹出“-”(”或这个“-”(”),在这种情况下,python会为不平衡的括号给出一个错误 下面是我编写的代码的外观: somedict={'-(':'value1','(-)':'value2'} somedata='this is some data containing -( and (

我对python很陌生,所以我有一本字典,里面有一些键,还有一个字符串。如果字符串中存在字典中找到的模式,我必须替换该字符串。字典和字符串都很大。我用正则表达式来寻找模式

这一切都可以正常工作,直到像这样的键弹出“-”(”或这个“-”(”),在这种情况下,python会为不平衡的括号给出一个错误

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

somedict={'-(':'value1','(-)':'value2'}
somedata='this is some data containing -( and (-)'
for key in somedict.iterkeys():
    somedata=re.sub(key, 'newvalue', somedata)
这是控制台中的错误

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
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
文件“C:\Python27\lib\re.py”,第151行,子文件
return\u compile(模式、标志).sub(repl、字符串、计数)
文件“C:\Python27\lib\re.py”,第244行,在编译中
raise错误,v#表达式无效
错误:不平衡括号
我也使用regex编译器尝试了很多方法,搜索了很多次,但没有找到任何解决问题的方法。非常感谢您的帮助。

您需要使用以下方法来转义密钥:

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

您在这里根本不使用正则表达式,因此不妨使用:

somedata = somedata.replace(key, 'newvalue')
如果您只想替换整个单词(因此在输入字符串的开头或结尾用空格或标点符号标记),则需要使用某种边界锚,此时使用正则表达式是有意义的。如果您只有字母数字单词(加下划线),
\b

somedata = re.sub(r'\b{}\b'.format(re.escape(key)), 'newvalue', somedata)
这会将
\b
放在要替换的字符串之前和之后,以便
foo baz bar
中的
baz
会更改,但
foo baz bar
不会更改

对于涉及非字母数字“单词”的输入,您需要将空格或开始、空格或结束锚与look aheads和look behinds匹配:

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

somedata=re.sub(r'(?:^ |)(?不要将
re
用于如此简单的事情-只需替换:

somedata = somedata.replace(key, 'newvalue')
也就是说,如果要从某个对象构造regexp,请使用转义特殊字符:

somedata=re.sub(re.escape(key), 'newvalue', somedata)

非常感谢Pavel!!它可以工作!!但也可以替换子字符串,如“--(”转换为“newvaluenewvalue”)我如何避免它。我只希望在匹配整个字符串时替换它。您需要准确地表达“整个字符串”的含义。
-(
不完全是一个“单词”。我的意思是,如果子字符串匹配,则不应替换正则表达式。例如:“data='thisdog has dog''和'data=re.sub(re.escape('dog'),'cat',data)'然后是'data='thiscat has a cat',这是不应该发生的。结果应该是'data='thisdog has a cat'。我只想在整个字符串匹配时替换它,而不仅仅是它的一部分。那么你的意思是它的前后必须有空格吗?不必后面有空格,但应该前面有空格。非常感谢Martijn,它确实可以工作。但是如果somedata='1',它也会替换子字符串-(-('converts to'newvaluenewvalue'如何避免它。我只希望在整个字符串匹配时替换它。例如,如果不完全匹配,则somedata应保持不变。然后只测试是否相等?
如果somedata==key:somedata='newvalue'
也执行您刚才描述的操作。如果'somedata='this is somedata''是一个d关键是“is”在那里似乎不起作用。“somedata.replace”也会替换子字符串,因此它似乎也不起作用。@JosyulaKrishna:你没有很好地解释自己。你想替换整个单词的字符串吗?那么在字符串周围或句子的开头或结尾加上空格?真的吗?但是
-(
不在
\w
中,
\b
的行为应该异常。
somedata=re.sub(re.escape(key), 'newvalue', somedata)