匹配多个正则表达式组并删除它们

3

我收到了一个文件,想从中提取有用的数据。文件的格式大致如下:

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个回答

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)

太好了。删除我的for循环并使用sub()函数运行良好。感谢您的帮助。 - greenie

2

在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()

1

(^LINE: \d+$)|(^\w+:)替换为空字符串""如何?

还可以使用\n代替^$以删除不需要的空行。


抱歉,我觉得我没有表达清楚。我想知道的是,在我的for循环中,忽略WHITESPACE、LINE和TOKEN匹配的内容的方式是否正确? - greenie
Alex已发布了这个版本的提高版并进行了Python化。 - Amarghosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接