标点符号或骆驼案的分句

时间:2014-07-28 00:21:09

标签: python regex string python-2.7 split

我在python中有一个很长的字符串,我试图把它分解成一个句子列表。只有这些句子中的一些缺少了它们之间的空间和空格。

实施例

  

我的车库里有9只羊。视频游戏非常酷。

我无法弄清楚正则表达式将两者分开!它让我疯了。

也有适当的标点句子,所以我想我会制作几种不同的正则表达式模式,每种模式都会分解出不同的组合风格。

输入

  

我的车库里有9只羊。视频游戏非常酷。有些花生可以唱歌,虽然它们的味道比听起来要好得多!

输出

  

['我的车库里有9只羊',   视频游戏非常酷。'   '有些花生可以唱歌,虽然它们的味道比听起来好很多!']

谢谢!

1 个答案:

答案 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}})。