如何使用Python将文件标记为正则表达式序列?

如何使用Python将文件标记为正则表达式序列?,python,token,lexical-analysis,Python,Token,Lexical Analysis,我想把一个文件解析成一个令牌列表。每个令牌至少包含一行,但可以包含多行。每个标记匹配一个正则表达式。如果输入不是令牌序列(即没有垃圾前导、中间或尾随),我想发出错误信号。我不关心内存消耗,因为输入文件相对较小 在Perl中,我将使用(伪代码): 我当然可以将这个1:1移植到Python中,但是有没有更类似Python的方法呢?(我不想逐行解析,然后在上面构建一个手工制作的状态机。)在re模块中有一个。您可以这样使用它: import re import sys def section(scan

我想把一个文件解析成一个令牌列表。每个令牌至少包含一行,但可以包含多行。每个标记匹配一个正则表达式。如果输入不是令牌序列(即没有垃圾前导、中间或尾随),我想发出错误信号。我不关心内存消耗,因为输入文件相对较小

在Perl中,我将使用(伪代码):

我当然可以将这个1:1移植到Python中,但是有没有更类似Python的方法呢?(我不想逐行解析,然后在上面构建一个手工制作的状态机。)

re
模块中有一个。您可以这样使用它:

import re
import sys

def section(scanner, token):
    return "SECTION", scanner.match.group(1)

def some_line(scanner, token):
    return "SOME LINE", token

def garbage(scanner, token):
    sys.exit('Found garbage: {}'.format(token))

# scanner will attempt to match these patterns in the order listed.
# If there is a match, the second argument is called.
scanner = re.Scanner([  
    (r"section (\d+)$$", section),
    (r"some line$", some_line), 
    (r"\s+", None),  # skip whitespace
    (r".+", garbage), # if you get here it's garbage
    ], flags=re.MULTILINE)


tokens, remainder = scanner.scan('''\

section 1

some line
''')
for token in tokens:
    print(token)
屈服

('SECTION', '1')
('SOME LINE', 'some line')
('SECTION', '1')
('SOME LINE', 'some line')