我正在编写一个通过字符串查找的代码,然后接收不被视为“保留关键字”的单词。我是regex的新手,但是花了很多时间来学习我需要寻找保留字的结构。到目前为止,我已经写了一些内容:
\b(import|false|int|etc)\b
我将使用数组列表将所有保留字输入到上面的字符串中,但我需要它与现在的工作方式相反。我已经想出如何使用上面的代码来搜索特定的单词,但是如何让它来查找上面没有列出的单词。我试过加入^
符号,但我没有运气。那些看到我做错了什么的正则表达的老兵?
答案 0 :(得分:0)
有两种显而易见的可能性,取决于你正在做什么(其他)。
可能性1:使用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,然后失败,然后回溯到另一个分支,然后匹配非关键字。 : - (
但是,如果你强烈依赖于一个大多数正则表达式的实现,例如,如果你有许多其他的基于正则表达式的规则,并且你正在循环处理它们,那就去吧!