2014-04-01 93 views
1

在一個巨大的文本文件中,爲了提高效率(我不逐行讀取文件),我將其處理爲一個大字符串,我想刪除任何在-swf之前和之後的字符。Python正則表達式替換匹配文本

我有一個看起來像這樣一個巨大的文字:

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行。有沒有辦法通過不逐行檢查文件來做到這一點?

+0

您的問題與問題標題無關。我會推薦重寫它,指的是使用正則表達式來替換大文本文件中的文本。 – aldux

回答

2

這應該做你想做的

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:如果要刪除文本有我在原來的答案給的正則表達式失敗「|」字符在裏面。我用一個沒有這個問題的正則表達式替換它。

+0

謝謝。這是我一直在尋找和它真的很快 – Georgia2004

1

可能爲了讓它變得非常快,您可以嘗試使用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 

只是一些想法!似乎相當快?

編輯:看凱文的正則表達式例子:

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:對不起,我看到我沒有看到「整個文件已經在內存中」。爲了獲得最佳的內存使用量,我建議通過大文件逐行進行。

+0

謝謝你的回覆。是的,我一直在尋找一些不需要我逐行瀏覽文件的東西。我已經實現了逐行代碼,並且耗時4個小時才能完成整個文件。正則表達式需要幾分鐘! – Georgia2004