2014-04-01 2 views
1

효율적인 이유로 커다란 문자열로 취급하는 거대한 텍스트 파일 (줄 단위로 파일을 읽지는 않습니다)에서 -swf 이후와 || 이전의 문자를 모두 삭제하고 싶습니다. Python Regex 일치하는 텍스트 바꾸기

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 

내가 원하는 최종 결과를 다음과 같이하기 : I 파티션 함수를 사용하여 라인으로이 라인을 수행 할 수 있습니다

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

나는 다음과 같습니다 거대한 텍스트가 파이썬하지만 줄 단위로 파일을 처리해야하기 때문에 많은 시간이 걸리며 파일에는 10M 개가 넘는 행이 있습니다. 파일을 한 줄씩 검토하지 않아도이를 수행 할 수있는 방법이 있습니까? '|'제거를위한 텍스트가있는 경우 내가 원래 대답했다 정규식 실패

+0

문제는 질문 제목과 관련이 없습니다. 큰 텍스트 파일에서 텍스트를 대체하기 위해 regex를 사용하는 것을 재 작성하는 것이 좋습니다. – 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 

편집 한이 원하는 것을해야 그 안에있는 성격. 이 문제가없는 정규식으로 바꿨습니다.

+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