我在python中有一个很长的字符串,我试图把它分解成一个句子列表。只有这些句子中的一些缺少了它们之间的空间和空格。
实施例
我的车库里有9只羊。视频游戏非常酷。
我无法弄清楚正则表达式将两者分开!它让我疯了。
也有适当的标点句子,所以我想我会制作几种不同的正则表达式模式,每种模式都会分解出不同的组合风格。
输入
我的车库里有9只羊。视频游戏非常酷。有些花生可以唱歌,虽然它们的味道比听起来要好得多!
输出
['我的车库里有9只羊', 视频游戏非常酷。' '有些花生可以唱歌,虽然它们的味道比听起来好很多!']
谢谢!
答案 0 :(得分:3)
regex
模块我会给你一个"分裂"和#34;全部匹配"选项。让我们从" Split"开始。
在许多引擎中,但不是Python的re
模块,您可以在零宽度匹配定义的位置进行拆分。
在Python中,为了分割一个位置,我会使用Matthew Barnett的杰出regex
module,其功能远远超过Python的默认re
引擎。这是我在Python中的默认正则表达式引擎。
根据您的输入,您可以使用此正则表达式:
(?V1)(?<=[a-z])(?=[A-Z])|(?<=[.!?]) +(?=[A-Z])
请注意,如果您使用奇怪格式的首字母缩写词,例如B. B. C.
,我们需要调整它。
示例Python代码:
string = "I have 9 sheep in my garageVideo games are super cool. Some peanuts can sing, though they taste a whole lot better than they sound!"
result = regex.split("(?V1)(?<=[a-z])(?=[A-Z])|(?<=[.!?]) +(?=[A-Z])", string)
print(result)
<强>输出:强>
['I have 9 sheep in my garage',
'Video games are super cool.',
'Some peanuts can sing, though they taste a whole lot better than they sound!']
<强>解释强>
(?V1)
指示引擎使用新行为,我们可以在零宽度匹配上进行拆分。(?<=[a-z])(?=[A-Z])
匹配一个位置,其中lookbehind (?<=[a-z])
可以声明前面的内容是小写字母,而前瞻(?=[A-Z])
可以断言后面的内容是大写字母。|
或...... (?<=[.!?]) +(?=[A-Z])
匹配一个或多个空格+
,其中lookbehind (?<=[.!?])
可以断言先前的点是点,爆炸,问号和空格,以及前瞻{{1}可以断言后面的内容是大写字母。 选项2:使用(?=[A-Z])
(再次使用findall
模块)
自&#34; Split&#34;和#34;全部匹配&#34;操作是同一枚硬币的两面,你可以这样做:
regex
同样,这不适用于print(regex.findall(r".+?(?:(?<=[.!?])|(?<=[a-z])(?=[A-Z]))",string))
(会跳过开始第二句re
的{{1}})。