首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3regex:分裂的句子不能正常工作

Python3regex:分裂的句子不能正常工作
EN

Stack Overflow用户
提问于 2018-04-04 04:25:15
回答 2查看 99关注 0票数 1

我有以下案文:

“当你第一次看到第二次文艺复兴时,它可能看起来很无聊。至少看两次,肯定会看到第二部分。它会改变你对矩阵的看法。人类是发动战争的人吗?人工智能是一件坏事吗?”

我试着用下面的正则表达式把它分成几个句子:

代码语言:javascript
复制
re.split(r'[\.\?\!][\s\n]', text.strip())

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

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

我尝试修改一下regex,最后添加一个"*“:

代码语言:javascript
复制
re.split(r'[\.\?\!][\s\n]*', text.strip())

但我得到的是:

“当你第一次看到第二次文艺复兴的时候,它可能看起来很无聊”,“至少看它两次,肯定会看第二部分”,“它会改变你对矩阵的看法”,“人类是发动战争的人吗”,“人工智能是一件坏事吗?”

我该怎么做?我不能在这里使用NLTK,我只需要使用python 3 regex。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-04 07:42:31

split()函数的性质来看,separator(或delimiter)将字符串分成两部分。当分隔符出现在字符串的起始(或结束)位置时,可能会发生这种产生空字符串的现象。

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

分离器的定位器

代码语言:javascript
复制
[\.\?\!](?:[\s]+|$)
  • 使用filter()函数从拆分中删除空字符串元素,或者使用re.findall()函数捕获字符串( separator除外)。
代码语言:javascript
复制
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)

用于捕获在演示中使用的正则表达式的findall()

代码语言:javascript
复制
((?:(?![\.\?\!](?:[\s]+|$)).)*)[\.\?\!](?:[\s]+|$)

脚本执行结果是

代码语言:javascript
复制
['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']
票数 1
EN

Stack Overflow用户

发布于 2018-04-04 04:28:54

您将获得最后一个元素为空,因为regex [\.\?\!][\s\n]*匹配在该?上执行拆分操作的最后一个?,该?为您提供两个字符串--一个在该?的左边,另一个在右边。最后一个?右边的字符串是一个空字符串,因此得到数组的最后一个空元素。

您可以使用以下regex获得匹配,而不是拆分:

代码语言:javascript
复制
[^.?!]+

点击演示

参见这里的Python代码输出

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49642756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档