Python正则仅替换from/on后的子组问题求助
问题:仅替换
from/on之后的单词为(1_原单词)形式 需求
仅将from/on之后出现的所有单词修改为(1_原单词)的形式。
输入内容
with crossroad from crossroad (on pike)
期望输出
with crossroad from (1_crossroad) (on (1_pike))
尝试的代码
import re rgxsubtable = re.compile(r"(?:from|on)[\s]+([\w\d.\"]+)", re.MULTILINE|re.IGNORECASE) # 查找需要修改的内容 tlist = set(rgxsubtable.findall(input_text)) for item in tlist: input_text = re.sub(r"(?!\B\w){0}(?
遇到的问题
上述代码会全局替换所有匹配的单词(比如两个crossroad都会被修改),而非仅替换from/on之后的目标单词,实际输出如下:
with (1_crossroad)
from (1_crossroad)
(on (1_pike))
解决方案
问题根源在于先提取所有目标单词再全局替换,导致无关位置的单词也被修改。可以直接利用正则的捕获组特性,精准替换from/on后的单词:
方法1:基础精准替换
通过捕获from/on、空白字符、目标单词三个部分,替换时保留前两部分,仅修改目标单词:
import re
input_text = """with crossroad
from crossroad
(on pike)"""
# 匹配from/on + 空白 + 目标单词的结构
pattern = re.compile(r"(from|on)(\s+)([\w\d.\"]+)", re.MULTILINE | re.IGNORECASE)
result = pattern.sub(r"\1\2(1_\3)", input_text)
print(result)
方法2:适配括号内的on场景
如果on出现在括号内(如(on pike)),调整正则兼容该场景:
import re
input_text = """with crossroad
from crossroad
(on pike)"""
# 同时匹配普通from/on和带括号的(on)结构
pattern = re.compile(r"(\(?(?:from|on)\)?)(\s+)([\w\d.\"]+)", re.MULTILINE | re.IGNORECASE)
result = pattern.sub(r"\1\2(1_\3)", input_text)
print(result)
两种方法运行后都能得到符合预期的输出:
with crossroad
from (1_crossroad)
(on (1_pike))
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

