python - re.sub 用于以特殊字符开头的字符串

标签 python python-re

很抱歉,如果这个问题与我发现的其他问题太相似。这是使用 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/

相关文章:

python - 使用 matplotlib 中的 dataframe.plot() 函数编辑条的宽度

python - urllib2 给出 HTTP 错误 400 : Bad Request for certain urls, 对其他人有效

python - 正则表达式在列表中分隔 slug 和 Lastname 的问题

python - "Empty matches are included in the result."是什么意思?

python - 通过正则表达式使用替代方法连接术语

python - 为什么 BeautifulSoup 重新格式化我的 XML?

python - 没有名为 defaults python django 的模块

python - 从 scipy 矩阵中删除行

python - 我正在尝试从 python 正则表达式解析字符串 - 当字符串包含 ":"时无法解析

python - 用于从 txt.file 中排除某些短语的正则表达式