替换不在两个特定单词之间的字符串
给定一个字符串,我需要用不在两个给定单词之间的区域中的另一个替换一个子字符串。
例如:
substring: "ate" replace to "drank", 1st word - "wolf", 2nd word - "chicken"
input: The wolf ate the chicken and ate the rooster
output: The wolf ate the chicken and drank the rooster
目前,我唯一的解决方案是非常不洁净的:
1)将位于两个单词之间的字符串替换为临时子字符串,方法是替换位于其间的字符串
2)替换我原本想要的字符串
3)将临时字符串恢复为原始字符串
编辑:
我特别提出了一个与我的情况稍有不同的问题,以保持与未来读者相关的答案。
当我需要忽略可以链接的“<”和“>”括号之间的“:”时,我的具体需求是根据“:”分割字符串,其中唯一的承诺是开头括号的数量等于右括号的数量。
例如,在以下情况下:
input a : <<a : b> c> : <a < a < b : b> : b> : b> : a
output [a, <<a : b> c>, <a < a < b : b> : b> : b>, a]
如果答案非常不同,我会开始另一个问题。
使用re.sub
单行函数。
>>> s = "The wolf ate the chicken and ate the rooster"
>>> re.sub(r'wolf.*?chicken|bateb', lambda m: "drank" if m.group()=="ate" else m.group(), s)
'The wolf ate the chicken and drank the rooster'
更新:
更新的问题可以通过使用regex
模块来解决。
>>> s = "a : <<a : b> c> : <a < a < b : b> : b> : b> : a"
>>> [i for i in regex.split(r'(<(?:(?R)|[^<>])*>)|s*:s*', s) if i]
['a', '<<a : b> c>', '<a < a < b : b> : b> : b>', 'a']
DEMO
def repl(match):
if match.group()=="ate":
return "drank"
return match.group()
x="The wolf ate the chicken and ate the rooster"
print re.sub(r"(wolf.*chicken)|bateb",repl,x)
你可以使用一个函数进行替换,用re.sub
来完成这个技巧
上一篇: replace a string not located between two specific words
下一篇: How to compare String representations of doubles if it ends in .00