所以,我想把这个文本分成句子。
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
但我的问题有各种分隔符(.?!
),这使问题复杂化。
你可以使用re.findall
和regex .*?[.!\?]
;惰性量词*?
确保每个模式匹配您想要匹配的特定分隔符:
import re
s = """You! Are you Tom? I am Danny."""
re.findall('.*?[.!\?]', s)
# ['You!', ' Are you Tom?', ' I am Danny.']
如果Python支持通过零长度匹配进行拆分,则可以通过匹配以其中一个分隔符开头的空字符串来实现此目的:
(?<=[.!?])
但是:ぁzxswい
不幸的是,https://regex101.com/r/ZLDXr1/1。然而,该解决方案在支持lookbehinds的其他语言中仍然有用。
但是,根据您的输入/输出数据样本,您需要使用前面有一个分隔符的空格进行拆分。所以正则表达式将是:
Python does not support split by zero-length matches
但是:ぁzxswい
Python演示:(?<=[.!?])\s+
如果这些空格是可选的,那么@Psidom提出的https://regex101.com/r/ZLDXr1/2解决方案是最好的,我相信。
如果您更喜欢使用拆分方法而不是匹配,则使用组拆分一个解决方案
re.findall
Filter会删除空字符串(如果有)。
即使句子之间没有空格,或者如果你需要以不同的标点符号结尾的捕获尾随句子,例如unicode省略号(或者根本没有),这将有效
它甚至可以保持原样(通过转义校正和添加括号)。
>>> import re
>>> re.split(r'(?<=[\.\!\?])\s*', s)
['You!', 'Are you Tom?', 'I am Danny.']
然后合并均匀和不均匀的元素并删除多余的空间
splitted = filter(None, re.split( r'(.*?[\.!\?])', s))
最简单的方法是使用splitted = filter(None, re.split( r'([\.!\?])', s))
。
Python split() without removing the delimiter
它将返回所有句子的列表而不会丢失分隔符。