Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中用re.sub替换单个单词_Python_Regex - Fatal编程技术网

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

在python中用re.sub替换单个单词,python,regex,Python,Regex,剧透:是的,这是一项任务。这个问题已经解决了,但出于个人利益,我想知道以下内容 因此,目前我们正在为赋值使用语法标记,我们在其中输入一个文件,并使用正则表达式字典,相应地给它们(关键字)上色 但也有一些问题 for i in iterations: pass 在上面这一行中,使用正则表达式 r'(\t*for.*in.*?:.?)”可以工作,但它会给整行着色。虽然这是允许的,但我真的希望它只标记for/in 尝试使用r'(\bfor\b |\bin\b)也不是善意的,也不是r'(for

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

因此,目前我们正在为赋值使用语法标记,我们在其中输入一个文件,并使用正则表达式字典,相应地给它们(关键字)上色

但也有一些问题

for i in iterations:
    pass
在上面这一行中,使用正则表达式
r'(\t*for.*in.*?:.?)”
可以工作,但它会给整行着色。虽然这是允许的,但我真的希望它只标记
for/in

尝试使用
r'(\bfor\b |\bin\b)
也不是善意的,也不是
r'(for)
,或r'(\sfor\s)


我将整个代码读入一个字符串,并使用re.sub()将所有出现的内容替换为
color+r'\1'+color\u end
,其中color指定颜色序列。

您可以使用捕获和反向引用:

^(\t*)(for\b)(.*)\b(in)\b(.*?:)
替换为
$1$2$3$4$5
。看

这里,表达式被分成5个子部分,包含
(…)
捕获组。在替换模式中,使用具有
$
+
n
格式的反向引用引用捕获的那些值,其中
n
是模式内捕获组的ID

如果您没有机会对多个捕获组运行1个正则表达式,请运行两个:

  • ^(\t*)for\b(?=.*\bin\b.*:)
    -->$1 for(请参阅)
  • ^(\t*for\b.*)bin\b(?=.*:)
    -->
    $1in
    (请参阅)
单个捕获组位于单词前的部分周围,单词后的部分不匹配,但使用正向前瞻检查。

以下是我的解决方案:

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)
重新导入
STR=”“”
对于迭代中的i:
通过
"""
模式=r'(\b)(用于“通过”中的(\b)'
更改=r'\1\2\3'
打印回复(图案、更改、STR)
因此,我用空格捕获关键字,并用as\1和\3返回它们

这使得:

<COLOR>for</COLOR> i <COLOR>in</COLOR> iterations:
    <COLOR>pass</COLOR>
迭代中i的
:
通过

使用
r'^(\t*)(for)(.*)(in)(.*?:。?)”
并替换为
$1$2$3$4$5
应提及上述内容(将进行编辑),但所有正则表达式都来自文件字典(每行的格式均为
“regex”):键入
例如
“(\t*for.*in.*:。?)”:对于
,并且该程序仅使用一个捕获组。因此,应该可以运行两次
re.sub()
,并将所有
首先标记为
,然后将所有
标记为
?是的,这是可能的。