Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 匹配多个正则表达式组并删除它们_Python_Regex_Lexical Analysis - Fatal编程技术网

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()效果很好。谢谢你的帮助。