很抱歉,如果这个问题与我发现的其他问题太相似。这是使用 re.sub 替换字符串中精确字符的变体。
我有一个看起来像这样的字符串:
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”替换为“Ar”。我当前的尝试如下所示:
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'
print(smiles_all)
new_smiles=re.sub('[*:]1','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([*Ar0])C(=N4)C([*:3])=C5C([*Ar1])=C([*Ar2])C(=C2([*:4]))N5
如您所见,这仍然会更改之前的值 10,11 等。我尝试了不同的变体,其中选择了 [*:1],但这也是不正确的。任何帮助将不胜感激。在我当前的输出中,* 也保留下来。需要交换,以便 *:1 变成 Ar
这是输出应该是什么的示例
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
*编辑:
这个问题一度被标记为由这个问题回答: Escaping regex string 当我按照建议实现 re.escape 时,我仍然收到错误:
new_smiles=re.sub(re.escape('*:1'),'Ar',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
C1([*:5])C([*:6])C2=NC1=C([Ar])C3=C([*:7])C([*:8])=C(N3)C([*:2])=C4C([*:9])=C([Ar0])C(=N4)C([*:3])=C5C([Ar1])=C([Ar2])C(=C2([*:4]))N5
最佳答案
给定:
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'
desired='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]
替换为[Ar]
。在正则表达式中,表达式 [*:1]
是一个字符类,它与类中的单个个字符相匹配,其中一个匹配。如果添加任何 regex repetition对于字符类,它将以任意顺序匹配这些字符,直至重复限制。
用 [Ar]
替换文字 [*:1]
的最简单方法是使用 Python 的字符串方法:
>>> smiles_all.replace('[*:1]','[Ar]')==desired
True
如果您想使用正则表达式,则需要转义这些元字符以获得文字字符串:
>>> re.sub(r'\[\*:1\]', "[Ar]", smiles_all)==desired
True
或者让 Python 为您进行转义:
>>> re.sub(re.escape(r'[*:1]'), "[Ar]", smiles_all)==desired
True
关于python - re.sub 用于以特殊字符开头的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67952637/