剧透:是的,这是一项任务。它已经解决了,但出于个人兴趣,我想知道以下内容。
因此,目前使用语法标记进行分配,我们在其中输入文件,并使用正则表达式字典,相应地为它们(关键字)着色。
但是,有一些问题。for i in iterations:
pass
在上面这一行,使用正则表达式
r'(\t*for.*in.*?:.?)'
会起作用,但会为整条线着色。虽然这是允许的,但我真的希望它只标记for/in
。
尝试使用r'(\bfor\b|\bin\b)'
不是善意,也不是r'(for)'
或r'(\ s 代表\ s )'。
我将整个代码读入一个字符串并使用re.sub()将所有出现的内容替换为colour + r'\1' + colour_end
,其中color指定颜色序列。
答案 0 :(得分:1)
您可以使用捕获和反向引用:
^(\t*)(for\b)(.*)\b(in)\b(.*?:)
替换为$1<color>$2</color>$3<color>$4</color>$5
。请参阅this demo。
此处,表达式分为5个子部分,其中(...)
个捕获组。在替换模式中,捕获的值使用$
+ n
格式的反向引用,其中n
是模式内捕获组的ID。
如果您没有机会运行具有多个捕获组的1个正则表达式,请在结束时运行两个:
^(\t*)for\b(?=.*\bin\b.*?:)
- &gt; $1<color>for</color>
(见another demo)^(\t*for\b.*)\bin\b(?=.*?:)
- &gt; $1<color>in</color>
(见here)。单个捕获组位于单词前面的部分,单词后面的部分不匹配,但以正向前瞻进行检查。
答案 1 :(得分:0)
这是我的解决方案:
import re
STR = """
for i in iterations:
pass
"""
pattern = r'(\b)(for|in|pass)(\b)'
change = r'\1<COLOR>\2</COLOR>\3'
print re.sub(pattern, change, STR)
所以我用空格捕获关键字并将其作为\ 1和\ 3
返回这给出了:
<COLOR>for</COLOR> i <COLOR>in</COLOR> iterations:
<COLOR>pass</COLOR>