Python 正则表达式替换匹配文本

Posted

技术标签:

【中文标题】Python 正则表达式替换匹配文本【英文标题】:Python Regex Replace Matching Text 【发布时间】:2014-05-12 21:30:55 【问题描述】:

在一个巨大的文本文件中,出于效率原因,我将其作为大字符串处理(我不逐行读取文件),我想删除 -swf 之后和 || 之前的任何字符

我有一个大文本,如下所示:

bla bla bla ||NULL||abc-swf||NULL||NULL
bla bla bla ||NULL||cdacda-swfend%23wrapclass||NULL||NULL
bla bla bla ||NULL||bgdbgdbgd-swf%28ML%29endBeliefnet.Web.UI.S||NULL||NULL

我希望最终结果如下所示:

bla bla bla ||NULL||abc-swf||NULL||NULL
bla bla bla ||NULL||cdacda-swf||NULL||NULL
bla bla bla ||NULL||bgdbgdbgd-swf||NULL||NULL

我可以使用 python 中的分区函数逐行执行此操作,但需要大量时间,因为它需要逐行处理文件并且文件有超过 10M 行。有没有办法不逐行检查文件来做到这一点?

【问题讨论】:

您的问题与题名无关。我建议重写它以使用正则表达式替换大文本文件中的文本。 【参考方案1】:

这应该做你想做的事

import re

s = '''bla bla bla ||NULL||abc-swf||NULL||NULL
bla bla bla ||NULL||cdacda-swfend%23wrapclass||NULL||NULL
bla bla bla ||NULL||bgdbgdbgd-swf%28ML%29endBeliefnet.Web.UI.S||NULL||NULL'''

# bad_regex = re.compile(r'(?<=swf)[^|]+') # will stop at a single pipe character |
regex = re.compile(r'(?<=-swf).*?(?=\|\|)') # matches everything between -swf and || 
regex.sub('', s)

输出 =

>>> print(s)
bla bla bla ||NULL||abc-swf||NULL||NULL
bla bla bla ||NULL||cdacda-swf||NULL||NULL
bla bla bla ||NULL||bgdbgdbgd-swf||NULL||NULL

编辑 1:如果要删除的文本包含“|”,我在原始答案中给出的正则表达式将失败其中的人物。我已将其替换为没有此问题的正则表达式。

【讨论】:

谢谢。这就是我一直在寻找的,它的工作速度非常快【参考方案2】:

你可以尝试使用 Cython 来让它变得非常快。 另外:也许您可以先尝试看看这是否表现更好->

def test_speed():
    row_text = 'bla bla bla ||NULL||cdacda-swfend%23wrapclass||NULL||NULL'
    string_list = row_text.split('||') # which gives a list
    # Then only partition in the string_list[2] area -> 
    string_list[2] = ''.join(string_list[2].partition('-swf')[0:2])
    # then join it together again: 
    row_text = '||'.join(string_list)

%timeit test_speed()
100000 loops, best of 3: 1.36 µs per loop

只是一些想法!好像挺快的?

编辑:查看 Kevin 的正则表达式示例:

import re
regex = re.compile(r'(?<=swf)[^|]+')
def test_regex_speed(regex):
    row_text = 'bla bla bla ||NULL||cdacda-swfend%23wrapclass||NULL||NULL'
    regex.sub('', row_text)

%timeit test_regex_speed(regex)
100000 loops, best of 3: 2.16 µs per loop

所以这有点慢,但您可以使用正则表达式一次完成整个文件。

编辑 2:对不起,我看到我没有看到“整个文件已经在内存中”。不过,为了获得最佳内存使用率,我建议逐行浏览大文件。

【讨论】:

感谢您的回复。是的,我正在寻找不需要我逐行浏览文件的东西。我已经实现了逐行代码,并且花了 4 个小时来浏览整个文件。正则表达式需要几分钟!

以上是关于Python 正则表达式替换匹配文本的主要内容,如果未能解决你的问题,请参考以下文章

python正则表达式

python 正则表达式

Python_正则表达式

tcl 正则匹配与替换

Python正则表达式

python 正则详解