【问题标题】:Is there a better way to swap string without a placeholder有没有更好的方法来交换没有占位符的字符串
【发布时间】:2016-08-03 05:45:06
【问题描述】:

我有一个字符串:

>>> 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而不是@@来减少冲突的机会。
  • 是的,有办法。你在用 Python 吗?
  • @wiktor 是的,python。

标签: python regex string replace swap


【解决方案1】:

在 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

【讨论】:

  • 感谢@wiktor!正是我正在寻找的正则表达式解决方案。
猜你喜欢
  • 2010-10-31
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多