繁体   English   中英

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

[英]re.sub for string starting with special character

抱歉,如果这个问题与我发现的其他问题太相似了。 这是使用 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 等。我尝试了不同的变体,其中我是 select [*:1],但这也是不正确的。 在这里的任何帮助将不胜感激。 在我目前的 output 中,* 也仍然存在。 这需要交换,以便 *:1 变为 Ar

这是 output 应该是什么的示例

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 正则表达式字符串当我按照建议实施 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'

您正在尝试用[Ar]替换文字字符串[*:1] ] 。 在正则表达式中,表达式[*:1]是一个字符 class,它与 class 中的单个字符匹配一次 如果您将任何正则表达式重复添加到字符 class,它将以任何顺序匹配这些字符,直到重复限制。

[Ar]替换文字[*:1]最简单方法是使用 Python 的字符串方法:

>>> smiles_all.replace('[*:1]','[Ar]')==desired 
True

如果要使用正则表达式,则需要转义这些元字符以获取文字字符串:

>>> re.sub(r'\[\*:1\]', "[Ar]", smiles_all)==desired
True

或者让 Python 为您执行 escaping :

>>> re.sub(re.escape(r'[*:1]'), "[Ar]", smiles_all)==desired
True

你可以试试:

re.sub(r"[*:]+1(?=])", "Ar", smiles_all)

与您的不同之处在于允许文字*:的 1+ 次重复,后跟 1 也确保通过?=后跟] ,即正向前瞻。

要得到

"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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM