【问题标题】:Python 3 regex: spliting sentences not working properlyPython 3 正则表达式:拆分句子无法正常工作
【发布时间】:2018-04-04 04:25:15
【问题描述】:

我有以下文字:

'第一次看到《第二次文艺复兴》可能看起来很无聊。至少看两遍,一定要看第二部分。它会改变你对矩阵的看法。人类是战争的始作俑者吗?人工智能是坏事吗?'

我正在尝试使用以下正则表达式将其拆分为句子:

re.split(r'[\.\?\!][\s\n]', text.strip())

由于某种原因,它没有删除最后一个问号。我得到的结果如下:

['第一次看《第二次文艺复兴》可能看起来很无聊', “至少看两遍,一定要看第二部分”, '它会改变你对矩阵的看法', '人类是发动战争的人', “人工智能是坏事吗?”]

我尝试稍微修改一下正则表达式,在末尾添加一个“*”:

re.split(r'[\.\?\!][\s\n]*', text.strip())

但这就是我得到的:

['第一次看《第二次文艺复兴》可能看起来很无聊', “至少看两遍,一定要看第二部分”, '它会改变你对矩阵的看法', '人类是发动战争的人', '人工智能是坏事', '']

我应该怎么做?我不能在这里使用 NLTK,我只需要使用 python 3 正则表达式。

【问题讨论】:

    标签: regex python-3.x nlp


    【解决方案1】:

    split() 函数的性质看来,separator(或delimiter)将一个字符串分成两个。当分隔符出现在字符串的开始(或结束)位置时,可能会发生这种在拆分处理过程中创建空字符串副产品的特殊行为。

    为了避免或删除这种类型的空字符串,您可以使用其他函数:filter() 函数来删除空字符串,或者 re.match()re.findall() 等。如下所示,以避免空字符串元素被拆分。

    分隔符的正则表达式

    [\.\?\!](?:[\s]+|$)
    

    - 使用filter() 函数从拆分中删除空字符串元素,或使用re.findall() 函数捕获除separator 之外的字符串。

    ss="""The first time you see The Second Renaissance it may look boring. Look at it at least twice and definitely watch part 2. It will change your view of the matrix. Are the human people the ones who started the war? Is AI a bad thing?"""
    
    splt= re.split(r"[\.\?\!](?:[\s]+|$)",ss)
    splt=list(filter(None,splt))
    print(splt)
    
    
    regs= re.compile(r'((?:(?![\.\?\!](?:[\s]+|$)).)*)[\.\?\!](?:[\s]+|$)')
    match= regs.findall(ss)
    print(match)
    

    Demo 用于捕获findall() 中使用的正则表达式

    ((?:(?![\.\?\!](?:[\s]+|$)).)*)[\.\?\!](?:[\s]+|$)
    

    脚本执行结果是

    ['The first time you see The Second Renaissance it may look boring', 'Look at it at least twice and definitely watch part 2', 'It will change your view of the matrix', 'Are the human people the ones who started the war', 'Is AI a bad thing']
    ['The first time you see The Second Renaissance it may look boring', 'Look at it at least twice and definitely watch part 2', 'It will change your view of the matrix', 'Are the human people the ones who started the war', 'Is AI a bad thing']
    

    【讨论】:

    • 我很高兴听到你玩得开心,谢谢:-)
    【解决方案2】:

    您将最后一个元素设为空白,因为您的正则表达式 [\.\?\!][\s\n]* 与最后一个 ? 匹配,因为在该 ? 上执行了拆分操作,这为您提供了 2 个字符串 - 一个出现在该 @987654326 的左侧@ 和一位在右边。最后一个 ? 右侧的字符串是一个空白字符串,因此您得到数组的最后一个元素为空白。

    您可以使用以下正则表达式获取匹配项,而不是拆分:

    [^.?!]+
    

    Click for Demo

    See the Python Code output here

    【讨论】:

    • 我试过这个正则表达式,但它不起作用。它返回我在问题中发布的第二个结果,最后一句话是一个空字符串。
    • 谢谢你,你是对的。该正则表达式匹配我要删除的字符。
    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多