正则表达式匹配以特殊字符结尾的句子。 ! ?但是忽略像乔治•W•布什这样的话。等等

时间:2013-05-16 06:42:48

标签: regex

我正在寻找一个正则表达式来解析一个文本文件,其中的句子以.!?等特殊字符结尾,但忽略了像George W这样的字词布什,霍普金斯先生,紫罗兰太太等。

我尝试(?!Mr|Mrs|[A-Za-z]\.\s)\S.+?[.!?](?=\s+|$),但这似乎不起作用。

3 个答案:

答案 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)[.!?])+

here on Regexr

不匹配字符.!?

但是当这些字母超出此次更改时会匹配这些字符etc|Dr|Mr|Mrs|\b[A-Za-z]|\s