Сопоставление нескольких групп регулярных выражений и удаление их

Мне дали файл, из которого я хотел бы извлечь полезные данные. Формат файла выглядит примерно так:

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

так далее...

То, что я хотел бы сделать, это удалить LINE: и номер строки, а также TOKENKIND: так что я просто оставил строку, которая состоит из 'somedata somedate somedata...'

Я использую Python для этого, используя регулярные выражения (которые я не уверен, что они правильные), чтобы соответствовать битам файла, который я хотел бы удалить.

Мой вопрос: как я могу заставить Python сопоставлять несколько групп регулярных выражений и игнорировать их, добавляя все, что не соответствует моему регулярному выражению, в мою выходную строку? Мой текущий код выглядит так:

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

3 ответа

Решение
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)

Нет необходимости использовать регулярные выражения в Python. В конце концов, это Python, а не 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()

Как насчет замены (^LINE: \d+$)|(^\w+:) с пустой строкой ""?

использование \n вместо ^ а также $ также удалить ненужные пустые строки.

Другие вопросы по тегам