Python正则表达式 - 替换两个特定单词之间未出现的字符串

7

给定一个字符串,我需要将一个子字符串替换为另一个子字符串,但只能在两个给定单词之间的区域之外进行。

例如:

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]

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

在Python中,你使用的是re还是regex?你考虑过非正则表达式的解决方案吗? - Kobi
re, Python 2.7,但同样适用于3.4。 - ErezO
在我的评论中提到的所有情况(以及更多情况),我愿意冒险说你不能使用Python的re正则表达式来完成它。使用regex模块可以进行递归(如果我没记错的话),但我不确定你是否想要这样做。编写一个循环,计算{}的数量,并在count0时进行替换。 - Kobi
另外,请编辑问题:示例很混乱,您应该提及更多有趣的情况。 - Kobi
你确定你提出的约束条件(“单词不在两个其他单词之间出现”)一定是最好的吗?也许另一个约束条件会导致更可行的解决方案 - 在引用的示例中,“行中最后一次出现的单词”就是这样一种替代方案,但我不知道它是否适用于你的实际用例...有时重新定义手头的问题可以让你摆脱看似困难的解决方案... - twalberg
显示剩余3条评论
2个回答

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
这就是我想表达的意思 :) - Bhargav Rao

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

的英译中,保留了 HTML 格式,不加解释。

DEMO链接无法正常工作,附加的Python示例可以完美运行。 - ErezO
是的,它只显示捕获的文本。添加仅用于展示嵌套的 < > 如何被捕获。 - Avinash Raj
我发现了一个问题:a< b <c a>>(没有“:”)被分成了['a','< b <c a>>']。我不想进行预优化,但是我不知道与定制的非正则表达式解决方案相比的性能如何。 - ErezO
如果您有任何进一步的问题,请将其作为新问题与示例输入和预期输出一起提出。 - Avinash Raj
提出了一个跟进问题 - http://stackoverflow.com/questions/29727339/python-regex-splitting-according-to-criteria - ErezO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接