如何在 python 中执行条件拆分

how can I perform conditional splitting with exceptions in python

我想将字符串拆分成句子。

但也有一些出乎我意料之外的例外情况:

str = "Text... Text. Text! Text? UPPERCASE.UPPERCASE. Name. Text."

所需拆分:

split = ['Text...', 'Text.', 'Text!', 'Text?', 'UPPERCASE.UPPERCASE. Name.', 'Text.']

如何使用正则表达式 python

到目前为止我的努力,

str = "Text... Text. Text! Text? UPPERCASE.UPPERCASE. Name. Text."
split = re.split('(?<=[.|?|!|...])\s', str)
print(split)

我得到了:

['Text...', 'Text.', 'Text!', 'Text?', 'UPPERCASE.UPPERCASE.', 'Name.', 'Text.']

预计:

['UPPERCASE.UPPERCASE. Name.']

[A-Z]+\. Name中的\s不拆分

你可以使用

(?<=[.?!])(?<![A-Z]\.(?=\s+Name))\s+

regex demo。详情:

  • (?<=[.?!]) - 正后视需要 .?! 紧邻当前位置
  • 的左侧
  • (?<![A-Z]\.(?=\s+Name)) - 如果有一个大写字母和一个 . 后跟 1+ 个空格 + Name 紧跟在当前位置的左侧,则匹配失败的负后视(注意 + 前瞻 中使用,这就是为什么它在前瞻中与 Python re\s+ 一起使用有必要检查 Name 空格后的存在,它将与下面的下一个 \s+ 模式匹配和消耗)
  • \s+ - 一个或多个空白字符。

参见 Python demo:

import re
text = "Text... Text. Text! Text? UPPERCASE.UPPERCASE. Name. Text."
print(re.split(r'(?<=[.?!])(?<![A-Z]\.(?=\s+Name))\s+', text))
# => ['Text...', 'Text.', 'Text!', 'Text?', 'UPPERCASE.UPPERCASE. Name.', 'Text.']