我正在寻找一个正则表达式来解析一个文本文件,其中的句子以.
,!
和?
等特殊字符结尾,但忽略了像George W这样的字词布什,霍普金斯先生,紫罗兰太太等。
我尝试(?!Mr|Mrs|[A-Za-z]\.\s)\S.+?[.!?](?=\s+|$)
,但这似乎不起作用。
答案 0 :(得分:4)
英语是一种明确的非常规语言。我不认为正则表达式是足够的:你可能需要一个完整的标记器,加上某种机器学习,可能是马尔可夫模型,来检测一个句子结束和下一个句子开始的位置。即便如此,它只是一种启发式 - 因为人类语言的使用是草率的,一个确切的解决方案可能永远不可能。
答案 1 :(得分:1)
我没有正则表达式专家,但我发现这个正则表达式可以很好地识别句子之间的
。 (?<!\b\p{Upper}\w{0,4})(?=[.?!]\s*\p{Upper})[.?!]\s*
它查找句子标点后跟大写字母,不包括以大写字母开头的单词,因为标题是大写的。
另请注意,这是java正则表达式,因此\p{Upper}
可能无效。
此外,标题长度为4是任意的,正则表达式需要一个固定长度的回顾,我不能认为任何标题缩写超过4个字符。
让我为任何学习正则表达式的人分解。
# Don't match where we have a short word beginning with a capital (for titles)
(?<!\b\p{Upper}\w{0,4})
(?=[.?!]\s*\p{Upper}) # Only match when followed by a captial. (for abbreviations)
[.?!] #match the punctuation
\s* #also match white space, so no trimming is required (optional)
这是一个无意义的测试段落,将这个正则表达式放在绳索上:
This is a sentence. I really want to win, etc. and win more. This is pretty neat. I want to thank Mr. Shea for his work. Mr. Hugo helped as well. M. Thénardier is thankful as well. The wonderful Mr. Albert Einstien PhD. is a cool dude as well.
编辑:我一直在考虑这个问题,而且我发现了一个这个正则表达式无效的案例。考虑一下这句话:
Joey loved talking to Max. This was because Max is his best friend.
在此示例中,Max. This
被选为名称和标题。这仅适用于短名称(带有\w{0,4}
的五个字符以下,4
可以调整为更小的字符以过滤更长的标题)我无法想到任何方法来解决此问题。学习什么单词是名称或标题。我想我的方法并不完美,但我觉得它在大多数情况下都足够接近。
答案 2 :(得分:0)
正则表达式无法智能地识别什么是缩写,以及句子的结尾是什么。
正则表达式可以做的是定义一组标记句子结尾的字符,因此不匹配,并且当这些字符应该匹配时定义一组例外。
尝试:
([^.!?]|(?<=etc|Dr|Mr|Mrs|\b[A-Za-z]|\s)[.!?])+
不匹配字符.!?
但是当这些字母超出此次更改时会匹配这些字符etc|Dr|Mr|Mrs|\b[A-Za-z]|\s