【问题标题】:how can I perform conditional splitting with exceptions in pythonpython - 如何在python中执行带有异常的条件拆分
【发布时间】:2020-11-06 07:09:14
【问题描述】:

我想把一个字符串拆分成句子。

但有一些我没想到的例外:

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 不拆分

【问题讨论】:

    标签: python python-3.x regex regex-lookarounds


    【解决方案1】:

    你可以使用

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

    请参阅regex demo。详情:

    • (?&lt;=[.?!]) - 正向向后看,需要 .?! 紧邻当前位置的左侧
    • (?&lt;![A-Z]\.(?=\s+Name)) - 如果有一个大写字母和一个 . 后跟 1+ 个空格 + Name 紧跟在当前位置的左侧,则匹配失败(注意 + 在 lookahead,这就是它与 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.']
    

    【讨论】:

    • 抱歉我的愚蠢问题。名称必须是“文本”,也不具体。但是您的回答帮助我解决了这个问题。非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多