在Python中for循环和re.sub怎么一起用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python中for循环和re.sub怎么一起用相关的知识,希望对你有一定的参考价值。

re.sub跟str.replace功能一样,区别在于sub更灵活,效率更高

跟for在一起用不知道具体什么意思,写了2个简单的函数,你参考下吧

import re


def 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)。两个函数被调用,rangelen,在 2.x Pythons 中,range 实际上构建了一个包含所有值的中间列表对象。将 for 与一系列列表索引一起使用是 C 或 BASIC 的惯用语沿用;迭代器效率更高,适用范围更广。 这是真的,但不是我的意思。在这种情况下,for 循环及其开销是完全不必要的,请参阅我的回答。

以上是关于在Python中for循环和re.sub怎么一起用的主要内容,如果未能解决你的问题,请参考以下文章

re.sub的使用方法有哪些?

Python:用 re.sub 替换列表中的多个特定单词

re.sub()介绍和用法

使用re.sub将文本替换为匹配到的内容

正则表达式:如何将 re.sub 与可变数量的元素一起使用?

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