代码之家  ›  专栏  ›  技术社区  ›  chetan sharma

从每一行和a)、b)、c)、d)中删除,列类型为pandas.core.series。系列

  •  -2
  • chetan sharma  · 技术社区  · 2 年前

    我对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
    

    我也用正则表达式编译器尝试了很多方法,搜索了很多,但没有找到任何解决问题的方法。任何帮助都将不胜感激。

    0 回复  |  直到 13 年前
        1
  •  17
  •   Martijn Pieters    13 年前

    你需要 逃跑 密钥使用 re.escape() :

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

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

    您在这里根本没有使用正则表达式,所以您也可以使用:

    somedata = somedata.replace(key, 'newvalue')
    

    如果你只想更换 整句话 (因此,在输入字符串的开始或结束处,周围有空格或标点符号),您需要某种边界锚点,此时使用正则表达式是有意义的。如果你只有字母数字单词(加下划线), \b 将工作:

    somedata = re.sub(r'\b{}\b'.format(re.escape(key)), 'newvalue', somedata)
    

    这使得 b 在您想要替换的字符串之前和之后 baz 在里面 foo baz bar 改变了,但是 foo bazbaz bar .

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

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

    这里的图案 (?:^|(?<=\s)) 使用 锚点、字符串锚点的开始和向后看断言,以匹配字符串开始或左侧紧邻空格的位置。同样地 (?:$|(?=\s) 对另一端执行相同的操作,匹配字符串的末尾或后跟空格的位置。

        2
  •  2
  •   Pavel Anossov    13 年前

    不要使用 re 对于如此简单的事情,只需替换:

    somedata = somedata.replace(key, 'newvalue')
    

    也就是说,如果你正在从某物构建正则表达式,请使用 re.escape 要转义特殊字符,请执行以下操作:

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