You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:20:38