正则表达式匹配两个单词后的所有内容

时间:2014-06-02 18:50:59

标签: python regex lambda

我一直在尝试使用正则表达式删除字符串的一部分。

Heroes Chapter 91 - Rescue

我需要删除" Chapter -number - "之后的所有内容,我无法删除" - "之后的所有内容。因为我不确定这个头衔是否总会成为"英雄"因此,如果标题是" -New- Spiderman",它将删除错误的部分。与#34; - "相同,如果它删除" - "之后的所有内容,它可能会删除错误的部分。它必须是" Chapter -number - "。我不知道我是否解释得很好。

但是,我尝试过这样做:

title = "Heroes Chapter 91 - Rescue"
title = re.sub('Chapter \d+ (\D+)', '', title)

但它会返回Heroes

title = "Heroes Chapter 91 - Rescue"
title = re.sub('Chapter (\d+).*', '', title)

但又返回Heroes

有什么想法吗?

PD:有人将我与this question联系起来,但我无法在那里找到解决方案,如果有人看到了,请指出。我显然不是专家:)

最终解决方案:

title = "Heroes Chapter 91 - Rescue"
title = re.sub('(Chapter \d+).*', '\\1', title)

4 个答案:

答案 0 :(得分:3)

您可以在此处使用捕获组( ),并在替换中引用捕获的组。

>>> re.sub('(Chapter \d+).*', '\\1', title)
'Heroes Chapter 91'

答案 1 :(得分:1)

当然会的。 re.sub替换整个字符串中匹配的部分。匹配的部分是“Chapter 91 - Rescue”,因为它完全匹配模式'Chapter(\ d +)(\ D +)',然后你用''完全替换它,所以它被删除了。唯一无与伦比的部分是“英雄”。

您可以再次匹配所有内容,但不是返回'',而是可以返回匹配字符串的一部分:

re.sub('(Chapter \d+).*', '\\1', title)

有了这个,你只保留parens之间的子模式,丢弃其余部分。你将保留“英雄第91章”的模式,其中'英雄'不匹配,但'第91章 - 救援',以。*结尾(贪婪的明星运营商匹配'直到任何非线性结束 - 字符列表)为章后的部分。数。从该匹配开始,仅保留“第91章”,因为它匹配第一个子模式(parens中唯一的子模式),并且只有该子模式获取并替换原始部分。这就是你如何保持'英雄'+'第91章'(丢弃尾随部分 - 实际标题)

答案 2 :(得分:1)

尝试

title = re.sub('(Chapter \d+) .*', '\1', title)

答案 3 :(得分:1)

尝试使用 lookbehind

re.sub('(?<=Chapter \d+) - .*', '', title)

如果re不支持lookbehind中的量词,请使用cheshircat的解决方案。