【问题标题】:Regular Expression: Simple Syntax Highlighting (Python)正则表达式:简单语法突出显示 (Python)
【发布时间】:2017-03-11 06:08:33
【问题描述】:

我一直在努力创建一个正则表达式来区分对象定义和在 Python 中调用该对象。目的是语法高亮。

这是需要解决的情况:(数字表示行)

0    def otherfunc(vars...):
1        pass
2
3    otherfunc(vars...)

我有兴趣匹配对象的名称,但如果在同一行中的任何位置前面有 def,则不会。上面代码的结果应该是:

“其他函数”,第 3 行

正则表达式能做这样的事情吗?

编辑:我只关心一次扫描/搜索一行。

【问题讨论】:

  • 是的,在一定程度上......但是如果你希望它在多行字符串等中匹配,那么它变得更加困难......
  • @AnttiHaapala 我只关心一次扫描一行。我将编辑问题以反映这一点。
  • 你如何确定它是否是一个函数?一个类是可调用的,其他一些对象也是如此。您是否在其中包含lambdas?
  • @cdarke 这是一个很好的观点。将其称为函数是不准确的。我将编辑我的问题以反映这一点。
  • 真的需要只用正则表达式来实现吗?如果您不熟悉正则表达式,有时可以使用更直接的方法。首先,使用简单的正则表达式搜索您要搜索的内容,然后遍历结果以丢弃您不关心的内容。

标签: python regex syntax-highlighting


【解决方案1】:

您可以使用否定的lookbehind。这匹配一个前面没有原子的原子。因此,在您的情况下,您正在寻找 otherfunc 前面没有 "def"

我在这里使用 PCRE 正则表达式。

(?<!def\s)otherfunc

【讨论】:

    【解决方案2】:

    我喜欢理查兹的回答,但我也会考虑 phyton 和意图的有效函数名称字符。所以这就是我想出的:

    (?<!(def\s))(?<=^|\s)[a-zA-Z_][\w_]*(?=\()
    

    看到这个working sample on Rexex101

    说明

    匹配有效的python function names if

    1. (?&lt;!(def\s)) 他们没有关注def 和空格
    2. (?&lt;=^|\s) 要么在行首,要么跟在空格后面(这是最接近的,因为lookbehinds 不支持通配符说明符)
    3. 后跟一个左括号 (()

    请注意,我不是 phyton 开发人员,因此为简单起见,[a-zA-Z_][\w_]* 匹配有效的 phyton 2.x 函数名称,您可以将表达式的这一部分扩展到 phyton 3.x,我不知道; )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-11
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2012-01-13
      • 1970-01-01
      • 2018-11-15
      相关资源
      最近更新 更多