Python使用re.sub替换特殊字符开头的精确子串匹配错误问题
Python re.sub 精确匹配替换问题解决方案
错误原因分析
- 第一次写法使用
[*:]1的正则存在问题:方括号[]是字符组语法,会匹配单个*或者单个:,而非连续的*:序列,匹配逻辑从根上就不符合预期。 - 第二次仅转义
*:1仍有问题:没有限制匹配到的*:1后面不能跟其他数字,因此会误匹配*:10、*:11这类多位数标识的前缀部分。
正确实现方案
你需要在匹配*:1的基础上,增加负向先行断言,限制1后面不能跟数字,保证只匹配独立的*:1标识:
import re smiles_all='C1([*:5])C([*:6])C2=NC1=C([*:1])C3=C([*:7])C([*:8])=C(N3)C([*:2])=C4C([*:9])=C([*:10])C(=N4)C([*:3])=C5C([*:11])=C([*:12])C(=C2([*:4]))N5' # 正则含义:匹配 *:1 且后面不跟数字 new_smiles = re.sub(r'\*:1(?!\d)', 'Ar', smiles_all) print(new_smiles)
输出结果
C1([*:5])C([*:6])C2=NC1=C([Ar])C3=C([*:7])C([*:8])=C(N3)C([*:2])=C4C([*:9])=C([*:10])C(=N4)C([*:3])=C5C([*:11])=C([*:12])C(=C2([*:4]))N5
正则说明
\*:转义匹配原字符*,避免被识别为正则量词:1:匹配连续的:1序列(?!\d):负向先行断言,要求当前位置后面不能跟数字,保证不会匹配多位数标识的前缀
内容的提问来源于stack exchange,提问作者German Barcenas
相关产品推荐
相关产品推荐

