Python在正则表达式上拆分而不删除分隔符

时间:2017-05-29 14:11:29

标签: python regex split

所以,我想把这个文本分成句子。

s = """You! Are you Tom? I am Danny."""

所以我得到了:

{"you!", "Are you Tom?", "I am Danny.}

这就是我想通过正则表达式'[.!\?]'拆分文本而不删除分隔符。在python中实现这个目的的最pythonic方法是什么?

我知道这些问题:

JS string.split() without removing the delimiters

Python split() without removing the delimiter

但我的问题有各种分隔符(.?!),这使问题复杂化。

5 个答案:

答案 0 :(得分:8)

You can use re.findall with regex .*?[.!\?]; the lazy quantifier *? makes sure each pattern matches up to the specific delimiter you want to match on:

import re

s = """You! Are you Tom? I am Danny."""
re.findall('.*?[.!\?]', s)
# ['You!', ' Are you Tom?', ' I am Danny.']

答案 1 :(得分:3)

如果Python支持通过零长度匹配进行拆分,则可以通过匹配以其中一个分隔符开头的空字符串来实现此目的:

(?<=[.!?])

演示:https://regex101.com/r/ZLDXr1/1

不幸的是,Python does not support split by zero-length matches。然而,该解决方案在支持外观的其他语言中仍然有用。

但是,根据您的输入/输出数据样本,您需要使用前面有一个分隔符的空格进行拆分。所以正则表达式将是:

(?<=[.!?])\s+

演示:https://regex101.com/r/ZLDXr1/2

Python演示:https://ideone.com/z6nZi5

如果空格是可选的,@ pidom建议的re.findall解决方案是最好的,我相信。

答案 2 :(得分:0)

如果您更喜欢使用拆分方法而不是匹配,则可以使用组

拆分一个解决方案
splitted = filter(None, re.split( r'(.*?[\.!\?])', s))

过滤器删除空字符串(如果有)。

即使句子之间没有空格,或者你需要以不同的标点符号结尾的捕捉尾随句子,例如unicode省略号(或者根本没有),这也会有效。

甚至可以保持原样(通过转义校正和添加括号)。

splitted = filter(None, re.split( r'([\.!\?])', s))

然后合并均匀和不均匀的元素并删除多余的空格

Python split() without removing the delimiter

答案 3 :(得分:0)

严格地说,你不想分开&#39;!?。#,而是分配在这些字符后面的空格上。以下内容适用:

>>> import re
>>> re.split(r'(?<=[\.\!\?])\s*', s)
['You!', 'Are you Tom?', 'I am Danny.']

这会在空格上分割,但前提是它前面有。,!或?字符。

答案 4 :(得分:0)

最简单的方法是使用nltk

import nltk   
nltk.sent_tokenize(s)

它将返回所有句子的列表而不会丢失分隔符。