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
)。两个函数被调用,range
和 len
,在 2.x Pythons 中,range
实际上构建了一个包含所有值的中间列表对象。将 for
与一系列列表索引一起使用是 C 或 BASIC 的惯用语沿用;迭代器效率更高,适用范围更广。
这是真的,但不是我的意思。在这种情况下,for 循环及其开销是完全不必要的,请参阅我的回答。以上是关于python re.sub 带有要查找的单词列表的主要内容,如果未能解决你的问题,请参考以下文章
python 正则表达式re.sub()提取字符串以及去除空格