在Python中for循环和re.sub怎么一起用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python中for循环和re.sub怎么一起用相关的知识,希望对你有一定的参考价值。
re.sub跟str.replace功能一样,区别在于sub更灵活,效率更高
跟for在一起用不知道具体什么意思,写了2个简单的函数,你参考下吧
import redef my_re_sub_test():
"""将文件中所有hello全部替换为Hi"""
for line in open('F:\\\\tmp.txt', encoding='GBK'):
newline = re.sub('hello', 'Hi', line)
print(newline, end='')
def my_re_sub_test2():
"""将字符串中按指定字典的key-value值替换"""
my_line = 'hello world'
reg_list = 'l': 'L', 'o': 'O'
for key in reg_list:
my_line = re.sub(key, reg_list[key], my_line)
print(my_line) 参考技术A 在python中re是一个常用的模块,主要是通过正则表达式进行字符串处理。它的速度相对自己用 find, replace, split来说,通常更快。当然功能更强大。
正则表达式也是一种语言,所以如果通过re.compile把它编译成对象,会速度快很多。所以我们经常看到这样的语句
exp = re.compile("\S+")
m = exp.search(bigtext)
print m.group(0)
这段话等同于
m = re.search("\S+", bigtext)
print m.group(0)
re.sub则相当于字符串操作中的replace,比如
sometext = re.sub("(?isu)\r\n", "\n", sometext)
上面这句话是将回车换行,变成换行。这是为了将windows下的文本文件移到linux下,防止某些软件不兼容所做的处理。
简单的说re.sub是做字符串替换的, re.compile是将正则表达式编译成一个对象,加快速度,并重复使用。
python re.sub 带有要查找的单词列表
【中文标题】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中for循环和re.sub怎么一起用的主要内容,如果未能解决你的问题,请参考以下文章