我有以下文字:
'你第一次看到第二次文艺复兴时,它可能看起来很无聊。至少看两次,绝对看第2部分。它会改变你对矩阵的看法。人类是开始战争的人吗?人工智能是件坏事吗?'
我正在尝试使用以下正则表达式将其拆分为句子:
re.split(r'[\.\?\!][\s\n]', text.strip())
由于某种原因,它没有删除最后一个问号。我得到的结果如下:
['你第一次看到第二次文艺复兴可能看起来很无聊', “看看它至少两次,绝对看第2部分,” '它会改变你对矩阵的看法', “人类是谁开始了战争”, “人工智能是件坏事吗?”
我尝试修改一点正则表达式,最后添加一个“*”:
re.split(r'[\.\?\!][\s\n]*', text.strip())
但这就是我得到的:
['你第一次看到第二次文艺复兴可能看起来很无聊', “看看它至少两次,绝对看第2部分,” '它会改变你对矩阵的看法', “人类是谁开始了战争”, “人工智能是一件坏事吗”, '']< -------看到这个空字符串
我应该怎么做?我不能在这里使用NLTK,我只需要使用python 3正则表达式。
答案 0 :(得分:1)
您将最后一个元素视为空白,因为您的正则表达式[\.\?\!][\s\n]*
与最后?
匹配,因为在?
上执行了哪个拆分操作,这会给您2个字符串 - 一个存在左边是?
,另一个出现在右边。最后一个?
右侧的字符串是一个空字符串,因此您将数组的最后一个元素留空。
您可以使用以下正则表达式来获取匹配项,而不是拆分:
[^.?!]+
<强> Click for Demo 强>
答案 1 :(得分: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']