用python中的re.sub替换单个单词

时间:2016-11-04 12:38:33

标签: python regex

剧透:是的,这是一项任务。它已经解决了,但出于个人兴趣,我想知道以下内容。

因此,目前使用语法标记进行分配,我们在其中输入文件,并使用正则表达式字典,相应地为它们(关键字)着色。

但是,有一些问题。

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指定颜色序列。

2 个答案:

答案 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>