有两种明显的可能性,具体取决于您正在做什么(其他)。
可能性一:使用dict 或set:
您可以只匹配 单词,然后在集合或字典中测试成员资格:
Reserved_words = set('import false true int ...'.split())
word_rx = r'\b\w+\b' # Or whatever rule you like for "words"
for m in re.finditer(...):
word = m.group(0)
if word in Reserved_words:
print("Found reserved word:", word)
else:
print("Found unreserved word:", word)
这种方法在词法分析器中经常使用,在这种情况下,编写一个包罗万象的“匹配一个单词”规则,然后根据关键字列表检查匹配的单词,比编写一个相当复杂的规则更容易为每个关键字和一个包罗万象来处理其余部分。
如果您想将某种有效负载与关键字相关联(例如用于实例化特定 AST 节点类型的类句柄等),您可以使用 dict。
可能性 2:使用命名组:
另一种可能性是您可以在正则表达式中使用named groups 来捕获关键字/非关键字值:
word_rx = r'\b(?<keyword>import|int|true|false|\.\.\.)|(?<nonkeyword>\w+)\b'
for m in re.finditer(...):
word = m.group('keyword')
if word:
print("Found keyword:", word)
else:
word = m.group('nonkeyword')
print("Found nonkeyword:", word)
这会比以前的方法慢,因为前缀:“int”匹配一个关键字,但“integral”开始匹配一个int,然后失败,然后回溯到另一个分支,然后匹配一个非关键字。 :-(
但是,如果您与大多数正则表达式实现紧密相关,例如,如果您有许多其他基于正则表达式的规则,并且您正在循环处理它们,那么就去吧!