我在python中有一个很长的字符串,我试图把它分解成一个句子列表。这些句子中只有一些缺少打孔和空白处。
示例
我有9只羊在我的garageVideo游戏是超级酷。
我想不出要把这两者分开的理由!把我逼疯了。
也有适当标点符号的句子,所以我想我应该做几个不同的正则表达式模式,每一个分开不同风格的组合。
输入
我有9只羊在我的garageVideo游戏是超级酷。有些花生可以唱歌,尽管它们的味道比听起来好得多!
输出
“我车库里有9只羊”,“电子游戏太酷了。”“有些花生会唱歌,尽管它们的味道比听起来要好得多!”
谢谢!
发布于 2014-07-28 00:27:23
职位拆分:使用regex模块
我会给你一个“分割”和一个“匹配所有”选项。让我们从“分裂”开始。
在许多引擎中,但不是Python的re模块中,您可以在零宽度匹配定义的位置拆分。
在Python中,为了分割位置,我将使用Matthew的杰出的 module,它的特性远远超过Python的默认re引擎。这是Python中的默认regex引擎。
通过输入,您可以使用以下正则表达式:
(?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])匹配一个位置,其中查找后面的(?<=[a-z])可以断言前面的是小写字母,而展望(?=[A-Z])可以断言后面的是大写字母。|或..。(?<=[.!?]) +(?=[A-Z])匹配一个或多个空格( + ),其中查找后面的(?<=[.!?])可以断言前面的是点、邦、问号和空格,而前面的(?=[A-Z])可以断言后面的是大写字母。findall选项2:使用(再次使用 regex 模块)
由于“拆分”和“匹配所有”操作是同一枚硬币的两面,所以您可以这样做:
print(regex.findall(r".+?(?:(?<=[.!?])|(?<=[a-z])(?=[A-Z]))",string))同样,这将不适用于re (这将跳过启动第二句Video的V )。
https://stackoverflow.com/questions/24986995
复制相似问题