无法使用正则表达式拆分
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)
和以前一样,我删除了最后一个匹配项,因为它是空字符串。不过这一次,我将 .
替换为 [^)]
,意思是“匹配任何不是右括号的字符”。
我试图用正则表达式拆分文本,但无法正常工作。我只想在找到模式时拆分。
模式=。 (无论是什么文字)。
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)
和以前一样,我删除了最后一个匹配项,因为它是空字符串。不过这一次,我将 .
替换为 [^)]
,意思是“匹配任何不是右括号的字符”。