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] 的不同变体,但这也是不正确的。这里的任何帮助将不胜感激。在我当前的输出中,* 也仍然存在。这需要交换以便 *: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'
您正在尝试用 [Ar]
替换 文字 字符串 [*:1]
。在正则表达式中,表达式 [*:1]
是一个字符 class,它匹配 class 中的 个字符 和 一个 匹配。如果您将任何 regex repetition 添加到字符 class,它将以任何顺序匹配这些字符,直到重复限制。
用[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
你可以试试:
re.sub(r"[*:]+1(?=])", "Ar", smiles_all)
与你的不同之处在于允许文字 *
和 :
重复 1 次以上,后跟 1 也确保通过 [=15= 后跟 ]
],即正面前瞻。
获得
"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"
抱歉,如果这个问题与我发现的其他问题太相似了。这是使用 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] 的不同变体,但这也是不正确的。这里的任何帮助将不胜感激。在我当前的输出中,* 也仍然存在。这需要交换以便 *: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'
您正在尝试用 [Ar]
替换 文字 字符串 [*:1]
。在正则表达式中,表达式 [*:1]
是一个字符 class,它匹配 class 中的 个字符 和 一个 匹配。如果您将任何 regex repetition 添加到字符 class,它将以任何顺序匹配这些字符,直到重复限制。
用[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
你可以试试:
re.sub(r"[*:]+1(?=])", "Ar", smiles_all)
与你的不同之处在于允许文字 *
和 :
重复 1 次以上,后跟 1 也确保通过 [=15= 后跟 ]
],即正面前瞻。
获得
"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"