【问题标题】:Reserved Keyword search, but in reverse. Regex保留关键字搜索,但相反。正则表达式
【发布时间】:2017-04-30 00:48:52
【问题描述】:

我正在编写一个代码,它查看一个字符串,然后接收不被视为“保留关键字”的单词。我是 regex 的新手,但花了很长时间学习我需要什么样的结构来查找保留字。到目前为止,我已经写了一些类似的东西:

\b(import|false|int|etc)\b

我将使用数组列表将所有保留字输入到上面的字符串中,但我需要它的工作方式与现在的工作方式相反。我已经想出了如何让它使用上面的代码搜索特定的单词,但是我怎样才能让它查找上面没有列出的单词。我试过合并^ 符号,但我没有任何运气。有没有看到我做错了什么的正则表达式老手?

【问题讨论】:

  • 你使用什么语言?

标签: regex keyword


【解决方案1】:

有两种明显的可能性,具体取决于您正在做什么(其他)。

可能性一:使用dictset

您可以只匹配 单词,然后在集合或字典中测试成员资格:

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,然后失败,然后回溯到另一个分支,然后匹配一个非关键字。 :-(

但是,如果您与大多数正则表达式实现紧密相关,例如,如果您有许多其他基于正则表达式的规则,并且您正在循环处理它们,那么就去吧!

【讨论】:

    猜你喜欢
    • 2016-12-22
    • 2019-11-17
    • 2012-08-13
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多