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 正则表达式替换匹配文本的主要内容,如果未能解决你的问题,请参考以下文章