2009-11-24 3 views
2

유용한 데이터를 추출 할 파일을 받았습니다.여러 regex 그룹 일치 및 제거

LINE: 1 
TOKENKIND: somedata 
TOKENKIND: somedata 
LINE: 2 
TOKENKIND: somedata 
LINE: 3 

등이 ...

내가 뭘하고 싶은 것은 LINE을 제거 할 수 있습니다 : : 및 줄 번호뿐만 아니라 TOKENKIND : 파일의 형식은 다음과 같이 간다 그래서 난 그냥 남아 있어요 'somedata somedate somedata ...'로 구성된 문자열

내가 원하는 파일의 비트와 일치하는 정규 표현식을 사용하여 파이썬을 사용하고 있습니다. 풀이.

내 질문은 어떻게 여러 정규 표현식 그룹과 일치하고 그들을 무시하고 내 정규 표현식과 일치하지 않는 내용을 출력 문자열에 추가 할 수 있습니까? 나의 현재 코드는 다음과 같습니다

import re 
import sys 

ignoredTokens = re.compile(''' 
    (?P<WHITESPACE>  \s+   ) | 
    (?P<LINE>   LINE:\s[0-9]+ ) | 
    (?P<TOKEN>   [A-Z]+:  ) 
''', re.VERBOSE) 

tokenList = open(sys.argv[1], 'r').read() 
cleanedList = '' 

scanner = ignoredTokens.scanner(tokenList) 

for line in tokenList: 
    match = scanner.match() 

    if match.lastgroup not in ('WHITESPACE', 'LINE', 'TOKEN'): 
     cleanedList = cleanedList + match.group(match.lastindex) + ' ' 

print cleanedList 

답변

4
import re 

x = '''LINE: 1 
TOKENKIND: somedata 
TOKENKIND: somedata 
LINE: 2 
TOKENKIND: somedata 
LINE: 3''' 

junkre = re.compile(r'(\s*LINE:\s*\d*\s*)|(\s*TOKENKIND:)', re.DOTALL) 

print junkre.sub('', x) 
+0

완벽. for 루프를 제거하고 sub()를 사용하면 문제가 없습니다. 당신의 도움을 주셔서 감사합니다. – greenie

1

어떻게 빈 문자열 ""(^LINE: \d+$)|(^\w+:) 교체에 대한?

원치 않는 빈 줄도 제거하려면 ^$ 대신 \n을 사용하십시오.

+0

죄송합니다. 나는 충분히 정확하게 생각하지 않았습니다. 내가 알고 싶은 것은 for 루프에서 WHITESPACE, LINE 및 TOKEN과 일치하는 것을 무시하는 올바른 방법일까요? – greenie

+0

Alex는 즉석에서 수정 된 버전을 게시했습니다. – Amarghosh

2

파이썬에서 정규식을 사용할 필요가 없습니다. 파이썬은 결국 Perl이 아니라. 단순하게 생각하고 문자열 조작 기능을 사용하십시오.

f=open("file") 
for line in f: 
    if line.startswith("LINE:"): continue 
    if "TOKENKIND" in line: 
     print line.split(" ",1)[-1].strip() 
f.close()