匹配双下划线的正则表达式?

5
我正在尝试扩展python.lang文件,以便使像__init__这样的方法得到突出显示。我一直在努力想出一个正则表达式,以匹配所有__privateMethods()python.lang是一个包含Python文件所有突出显示规则的XML文件。例如:
<context id="special-variables" style-ref="special-variable">
   <prefix>(?&lt;![\w\.])</prefix>
   <keyword>self</keyword>
   <keyword>__name__</keyword>
   <keyword>__debug__</keyword>
</context>

如何扩展它以匹配双下划线?


[解决方案]: 我在我的 python.lang 文件中添加了以下内容(如果有人感兴趣):

首先,您需要在定义样式的顶部附近添加此行。

<style id="private-methods" _name="Private Methods" map-to="def:special-constant"/>

然后,您将添加Carles在他的答案中提供的正则表达式

<context id="private-methods" style-ref="private-methods">
    <match>(__[a-zA-Z_]*(__)?)</match>
</context>

这是完成后的效果! enter image description here

哇!感谢您的报告。 - eyquem
2个回答

5
应该改为:
(__[a-zA-Z0-9_]*(__)?)

为了匹配以下所有内容:
__hello()
__init__()
__this_is_a_function()
__this_is_also_a_function__()
__a_URL2_function__()

谢谢,我已经想出如何添加它了。 - Kredns
@Lucas 不错... 但你最终使用了Mikhail的正则表达式 ;) - Carles Barrobés
@Carles:哎呀!我复制了文件的错误部分。实际上,我最终使用了你的部分。;) - Kredns
@Carles:我刚刚注意到一个错误。你的解决方案不能匹配大写字母的单词。我已经更新了我的问题中的正则表达式来修复这个问题。 - Kredns
此时,如果你的最终__是可选的,那么只需使用(__[a-zA-Z0-9_]*)会更简单。它们匹配相同的内容,主要区别是你是否需要对__进行捕获。 - muhmuhten
显示剩余2条评论

1

将您之前的案例与以下内容匹配(rubular example):

(^__[a-z]*__$)

@Mikhail 我认为应该使用 (^__[a-z]+__$) 来防止匹配 ____. - OnesimusUnbound
@OnesimusUnbound:不,我实际上也想让它匹配第二组下划线。 - Kredns
@Lucas McCoy 你的意思是匹配四个下划线吗? - OnesimusUnbound
@OnesimusUnbound:我将匹配__methods()__methods__(),所以他的正则表达式没问题。我会稍微修改一下。 - Kredns
@OnesimusUnbound:看起来很不错,但是当我添加 () 时它就无法匹配了。我不想让括号被突出显示,但是需要匹配它们之前的所有内容。另外,你应该将其发布为答案。 - Kredns
@Lucas McCoy将其更改为\w并在末尾添加了()(http://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes) http://regexr.com?2t1k7 - OnesimusUnbound

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接