[英]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.