无法使用正则表达式拆分

Not able to split with regular expresion

我试图用正则表达式拆分文本,但无法正常工作。我只想在找到模式时拆分。

模式=。 (无论是什么文字)。

txt = "primer dia. (pag. 4 - pag. 5) otro dia mas. (pag. 4 - pag. 5) tercer parte. (pag. 9)"
x = re.split("\.\s\(.+\)", txt)
print(x)

预期输出 = ['primer dia'、'otro dia mas'、'tercer parte.']

但是代码不起作用,因为它只是 returns 第一部分,我是不是漏掉了什么?

谢谢。

一种方法是首先使用正则表达式交替来匹配括号中的术语,这是您不想要的,然后回退到匹配您确实想要的句子。

txt = "primer dia. (pag. 4 - pag. 5) otro dia mas. (pag. 4 - pag. 5) tercer parte. (pag. 9)"
matches = [x for x in re.findall(r'\(.*?\)|(\w+(?: \w+)*\.)', txt) if x]
print(matches)  # ['primer dia.', 'otro dia mas.', 'tercer parte.']

请注意,我们只将所需的内容放在捕获组中。这意味着 (...) 会将 re.findall 的输出显示为空字符串,我们使用简单的列表理解将其删除。

另一种方法是实际更正您的正则表达式。问题是正则表达式是贪婪的,所以带括号的匹配实际上是从第一个括号匹配到最后一个。两个解决方案。

第一个解决方案:实现non-greedy

txt = "primer dia. (pag. 4 - pag. 5) otro dia mas. (pag. 4 - pag. 5) tercer parte. (pag. 9)"
x = re.split(r"\.\s\(.+?\)", txt)[:-1]
print(x)

与您的代码有两个不同之处。第一个,也是最重要的,就是我在+之后加了一个?,变成了non-greedy。第二个是我删除了最后一个匹配项,因为在句子的末尾,你有一个你可能不关心的空字符串。

第二种解决方案:拒绝括号匹配

txt = "primer dia. (pag. 4 - pag. 5) otro dia mas. (pag. 4 - pag. 5) tercer parte. (pag. 9)"
x = re.split(r"\.\s\([^)]+\)", txt)[:-1]
print(x)

和以前一样,我删除了最后一个匹配项,因为它是空字符串。不过这一次,我将 . 替换为 [^)],意思是“匹配任何不是右括号的字符”。