簡體   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