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

GA1*_*GA1 3 python regex split

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

s = "You! Are you Tom? I am Danny."
Run Code Online (Sandbox Code Playgroud)

所以我得到:

["You!", "Are you Tom?", "I am Danny."]
Run Code Online (Sandbox Code Playgroud)

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

我知道这些问题:

JS string.split()没有删除分隔符

Python split()而不删除分隔符

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

Psi*_*dom 9

你可以使用re.findall正则表达式.*?[.!\?]; 延迟量词*?确保每个模式匹配您想要匹配的特定分隔符:

import re

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


Ruu*_*ong 9

严格来说,您不想在“!?.”上进行分割,而是在这些字符后面的空格上进行分割。以下将起作用:

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

这会在空格上分割,但前提是它前面有 .、! 或 ? 特点。


Dmi*_*rov 6

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

(?<=[.!?])
Run Code Online (Sandbox Code Playgroud)

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

不幸的是,Python 不支持按零长度匹配拆分。然而,该解决方案在支持后视的其他语言中可能仍然有用。

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

(?<=[.!?])\s+
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • Python 从 3.7 开始支持零长度匹配。 (2认同)