Python 匹配多个正则表达式组并删除它们
我得到了一个文件,我想从中提取有用的数据。文件的格式如下所示:Python 匹配多个正则表达式组并删除它们,python,regex,lexical-analysis,Python,Regex,Lexical Analysis,我得到了一个文件,我想从中提取有用的数据。文件的格式如下所示: LINE: 1 TOKENKIND: somedata TOKENKIND: somedata LINE: 2 TOKENKIND: somedata LINE: 3 import re import sys ignoredTokens = re.compile(''' (?P<WHITESPACE> \s+ ) | (?P<LINE>
LINE: 1
TOKENKIND: somedata
TOKENKIND: somedata
LINE: 2
TOKENKIND: somedata
LINE: 3
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
等等
我想做的是删除LINE:和行号以及TOKENKIND:所以我只剩下一个字符串,它由'somedata somedate somedata…'组成
我使用Python来实现这一点,使用正则表达式(我不确定是否正确)来匹配我要删除的文件位
我的问题是,如何让Python匹配多个正则表达式组并忽略它们,将正则表达式不匹配的任何内容添加到输出字符串中?我当前的代码如下所示:
LINE: 1
TOKENKIND: somedata
TOKENKIND: somedata
LINE: 2
TOKENKIND: somedata
LINE: 3
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
重新导入
导入系统
ignoredTokens=re.compile(“”)
(?P\s+)|
(?P行:\s[0-9]+)|
(?P[A-Z]+:)
'',重复冗长)
tokenList=open(sys.argv[1],'r').read()
清除列表=“”
scanner=ignoredTokens.scanner(令牌列表)
对于令牌列表中的行:
match=scanner.match()
如果match.lastgroup不在('WHITESPACE','LINE','TOKEN'):
cleanedList=cleanedList+match.group(match.lastindex)+”
打印清除列表
用空字符串替换(^LINE:\d+$)|(^\w+:)
怎么样
使用
\n
而不是^
和$
删除不需要的空行。无需在Python中使用正则表达式。毕竟是Python,而不是Perl。简单思考并使用它的字符串操作功能
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)
f=open("file")
for line in f:
if line.startswith("LINE:"): continue
if "TOKENKIND" in line:
print line.split(" ",1)[-1].strip()
f.close()
对不起,我觉得我不够精确。我想知道的是,在我的for循环中,忽略任何与空格、行和标记匹配的内容是否正确?Alex已经发布了这个的即兴和pythonified版本。完美。删除for循环并使用sub()效果很好。谢谢你的帮助。