Python Regex - 替换不在两个特定单词之间的字符串

时间:2015-04-16 12:50:54

标签: python regex

给定一个字符串,我需要在两个给定单词之间的区域中替换另一个子字符串。

例如:

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)通过Replace a string located between

将位于两个单词之间的字符串替换为临时子字符串

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]

如果答案非常不同,我将开始另一个问题。

2 个答案:

答案 0 :(得分:3)

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)|\bate\b",repl,x)

您可以使用替换功能来执行re.sub

的技巧

答案 1 :(得分:1)

使用re.sub单行功能。

>>> s = "The wolf ate the chicken and ate the rooster"
>>> re.sub(r'wolf.*?chicken|\bate\b', 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