2016-08-03 42 views
1

我有一个字符串:有没有更好的方式来交换字符串,不占位

>>> s = 'Y/NOUN/dobj>_hold/VERB/ROOT_<membership/NOUN/dobj_<with/ADP/prep_<X/PROPN/pobj_>,/PUNCT/punct' 

,目标是到Y/位置改变到X/,即是这样的:

>>> s.replace('X/', '@@').replace('Y/', 'X/').replace('@@', 'Y/') 
'X/NOUN/dobj>_hold/VERB/ROOT_<membership/NOUN/dobj_<with/ADP/prep_<Y/PROPN/pobj_>,/PUNCT/punct' 

假设在进行替换时不会发生冲突,例如X/Y/是唯一的,并且只会在原始字符串中发生一次。

有没有办法做没有占位符的替换?目前,我正在使用@@占位符交换位置。

+0

可以使用'\ 0'而不是'@@'来减少冲突的可能性。 – anubhava

+0

是的,有办法。你在使用Python吗? –

+1

@wiktor是的,python。 – alvas

回答

2

在Python中,使用正则表达式的一个简单的方法是通过在re.sub更换部件,您可以评估一个lambda /请与捕获组捕获文本,并选择适当的更换:

所以,(X|Y)/我假设XY是潜在的多字符字符串占位符,否则使用([XY]))应该工作:

import re 
s = 'Y/NOUN/dobj>_hold/VERB/ROOT_<membership/NOUN/dobj_<with/ADP/prep_<X/PROPN/pobj_>,/PUNCT/punct' 
print(s) 
print(re.sub(r"(X|Y)/", lambda m: "Y/" if m.group(1) == 'X' else 'X/' , s)) 

输出:

Y/NOUN/dobj>_hold/VERB/ROOT_<membership/NOUN/dobj_<with/ADP/prep_<X/PROPN/pobj_>,/PUNCT/punct 
X/NOUN/dobj>_hold/VERB/ROOT_<membership/NOUN/dobj_<with/ADP/prep_<Y/PROPN/pobj_>,/PUNCT/punct 
+1

谢谢@wiktor!只是我正在寻找的正确的正则表达式解决方案。 – alvas

相关问题