python re.sub 带有要查找的单词列表

Posted

技术标签:

【中文标题】python re.sub 带有要查找的单词列表【英文标题】:python re.sub with a list of words to find 【发布时间】:2012-06-13 16:14:14 【问题描述】:

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

【问题讨论】:

first_word = re.sub(exclusionList[a], '',first_word) 文件 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py",第 151 行,在 sub return _compile(pattern, flags).sub(repl, string, count) 文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py”中,第 245 行, in _compile raise error, v # invalid expression error: nothing to repeat Junuxx,感谢您的帮助。我只是将 '\+' 添加到 excludeList 中,它现在可以工作了。由于列表是静态的,这对我来说是一个很好的解决方案。感谢您的帮助。 【参考方案1】:

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

你也可以去掉for循环,像这样:

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

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

【讨论】:

抱歉,如果我感到困惑。那部分有效。我将其从代码中删除以更清楚地说明问题所在,并将异常作为注释包含在内。感谢您的帮助。 @EnglishGrad:不,加号是异常的原因。比较 re.sub('+', '', 'foo')re.sub('\+', '', 'foo')。第一个给出了你看到的异常,第二个没有。 Junuxx,我明白你现在在说什么了。感谢您的帮助。【参考方案2】:

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

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

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

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

【讨论】:

关于单词边界的观点很好,但我不同意你关于循环的建议。 for a in range(0,len(seq)): do something with seq[a] 表单在几个方面受到限制。 seq 必须支持 len()[] 访问,因此您将无法传递除列表或元组以外的任何内容(集合和字典将失败 - 不 [],以及生成器或生成器表达式 - 不len)。两个函数被调用,rangelen,在 2.x Pythons 中,range 实际上构建了一个包含所有值的中间列表对象。将 for 与一系列列表索引一起使用是 C 或 BASIC 的惯用语沿用;迭代器效率更高,适用范围更广。 这是真的,但不是我的意思。在这种情况下,for 循环及其开销是完全不必要的,请参阅我的回答。

以上是关于python re.sub 带有要查找的单词列表的主要内容,如果未能解决你的问题,请参考以下文章

Python排序和删除列表中的重复项使用re.sub

带有正则表达式的 Python lambda

Python - re.sub 返回模式而不是替换

python 正则表达式re.sub()提取字符串以及去除空格

python3用正则怎么删除指定字符串前面和后面的内容,只保留中间部分的内容,并存入列表?

带有标志的 Python re.sub 不会替换所有出现