![](/img/trans.png)
[英]Remove special character and apostrophe and unwanted space in string using re.sub function in python
[英]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.