有没有更好的方法来交换没有占位符的字符串
Is there a better way to swap string without a placeholder
我有一个字符串:
>>> 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/
是唯一的,并且在原始字符串中只会发生一次。
有没有不用占位符进行替换的方法? 目前,我正在使用 @@
占位符交换位置。
在 Python 中,使用正则表达式的一种简单方法是通过 re.sub
替换部分中的 lambda,您可以在其中 evaluate/check 使用捕获组捕获的文本和 select适当的替换:
因此,(X|Y)/
(我假设 X
和 Y
可能是多字符字符串占位符,否则使用 ([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
我有一个字符串:
>>> 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/
是唯一的,并且在原始字符串中只会发生一次。
有没有不用占位符进行替换的方法? 目前,我正在使用 @@
占位符交换位置。
在 Python 中,使用正则表达式的一种简单方法是通过 re.sub
替换部分中的 lambda,您可以在其中 evaluate/check 使用捕获组捕获的文本和 select适当的替换:
因此,(X|Y)/
(我假设 X
和 Y
可能是多字符字符串占位符,否则使用 ([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