6

我对 RE 不太熟悉,但我正在尝试遍历一个列表并使用re.sub它从保存在变量中的一大块文本中取出多个项目first_word

re.sub先删除标签,这很好用,但接下来我想删除exclusionList变量中的所有字符串,但我不知道该怎么做。

感谢您的帮助,这是引发异常的代码。

exclusionList = ['+','of','<ET>f.','to','the','<L>L.</L>']

for a in range(0, len(exclusionList)):
      first_word = re.sub(exclusionList[a], '',first_word)

例外:

first_word = re.sub(exclusionList[a], '',first_word)
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 151, in sub
return _compile(pattern, flags).sub(repl, string, count)
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 245, in _compile
raise error, v # invalid expression error: nothing to repeat
4

2 回答 2

10

加号是正则表达式中的运算符,意思是“前面的一个或多个重复”。例如,x+表示 的一个或多个重复x。如果要查找和替换实际+标志,则需要像这样对其进行转义:re.sub('\+', '', string). 因此,更改您的 excludeList 中的第一个条目。

您还可以消除 for 循环,如下所示:

exclusions = '|'.join(exclusionList)
first_word = re.sub(exclusions, '', first_word)

管道符号|表示正则表达式中的析取,因此x|y|z匹配 x 或 y 或 z。

于 2012-06-10T12:17:36.963 回答
2

您的程序的基本形式是正确的,所以我怀疑您遇到的任何问题都与您使用的正则表达式有关。'+' 本身是一个无效的正则表达式,您需要使用 '\' 对其进行转义。

从使用角度来看,Python 允许您指定字符串不应该进行任何反斜杠转义,这样您就不必在您的正则表达式中乱扔“\\”,而您的意思是“\”。其语法是一个前导的“r”,如 中r'\+',您应该用它替换 excludeList 中的第一项。

如果您要提取单词“to”、“the”等,那么您还需要确保提取的是整个单词,并且不要意外提取“tooth”中的“to”或“the “ 其他”。添加“\b”以指定单词边界以防止这种情况:r'\bto\b'r'\bthe\b'.

最后,for a in range(0, len(exclusionList)):通过迭代列表本身更简单地编写:for exclusion in exclusionList:.

于 2012-06-10T12:24:25.797 回答