3

有用なデータを抽出したいファイルが与えられました。ファイルの形式は次のようになります。

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

等...

私がやりたいのは、LINE:と行番号およびTOKENKIND:を削除することです。そのため、「somedatasomedatesomedata...」で構成される文字列が残ります。

私はこれを行うために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
4

3 に答える 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)
于 2009-11-24T16:26:15.457 に答える
2

Python で正規表現を使用する必要はありません。結局のところ、Perl ではなく Python です。シンプルに考えて、その文字列操作機能を使用してください

f=open("file")
for line in f:
    if line.startswith("LINE:"): continue
    if "TOKENKIND" in line:
        print line.split(" ",1)[-1].strip()
f.close()
于 2009-11-25T00:55:30.270 に答える
1

(^LINE: \d+$)|(^\w+:)空の文字列に置き換えるのはどう""ですか?

and\nの代わりに使用して、不要な空行も削除します。^$

于 2009-11-24T16:21:08.183 に答える