我想找到一个正则表达式,它可以将段落(长字符串,无需担心换行符)分解成句子,使用的规则是:an of{?, !}句子的结尾应该是一个空格,然后是一个大写字母(我知道这对现实生活来说不是一个好规则)。在
我有一些东西在部分工作,但它不能完全起作用:
line = 'a b c FFF! D a b a a FFF. gegtat FFF. A'
matchObj = re.split(r'(.*?\sFFF[\.|\?|\!])\s[A-Z]', line)
print (matchObj)
印刷品
^{pr2}$我想得到:
['a b c FFF!', 'D a b a a FFF. gegtat FFF.']
有两个问题。在
为什么结果中有空成员(''
)?
我理解为什么D
会从分割结果中去掉-它是第一次搜索的一部分。我怎样才能使我的搜索结构有所不同,这样标点符号后面的大写字母就会被放回去,这样它就可以包含在下一个句子中呢?在这种情况下,如何让D出现在分割结果的第二个元素中?
我知道我可以用某种for循环来完成,只需去掉第一个结果,再加上大写字母,然后再重复一遍,但这似乎不那么像Python。如果regex不是这里的方法,那么还有什么东西可以避免for循环吗?在
谢谢你的建议。在
要解决第一个问题(由} 或^{} :
split()
返回的结果中的空字符串),使用^{您在输出中看到空字符串,因为
split()
应该这样做:使用匹配的组作为分隔符拆分输入字符串。对于第二个问题(输出中缺少的D),使用lookahead assertion
^{pr2}$(?=...)
:Lookaheads、negative Lookaheads、lookbehinds和negative lookebhinds是四种断言,可以用来表示“只有在group后面/前面加上group时才匹配此组,但不使用字符串”。
仔细阅读您的表达式,您似乎误解了}中的一个。在
[...]
运算符的语法。似乎要匹配.
、?
和{如果是这样,那么可以将
[\.|\?|\!]
重写为[.?!]
:[.?!]
不仅更紧凑,而且更正确:使用[\.|\?|\!]
还匹配了|
字符(因此'a b c FFF|'
是一个有效的匹配)!相关问题 更多 >
编程相关推荐