2

我正在寻找一个正则表达式来解析一个文本文件,其中句子以特殊字符结尾.,但忽略 George W. Bush、Hopkins Mr. Violet 等单词!?

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

4

3 回答 3

4

英语绝对是一种非常规语言。我认为一个正则表达式是不够的:你可能需要一个完整的标记器,加上某种机器学习,可能是马尔可夫模型,来检测一个句子的结尾和下一个句子的开始。即便如此,它也只是一种启发式方法——由于人类语言的使用是草率的,因此可能永远不可能有一个精确的解决方案。

于 2013-05-16T06:50:39.930 回答
1

正则表达式不能智能地识别什么是缩写,什么是句子的结尾。

正则表达式可以做的是定义一组标记句子结尾的字符,因此不匹配,并在这些字符无论如何都应该匹配时定义一组异常。

尝试:

([^.!?]|(?<=etc|Dr|Mr|Mrs|\b[A-Za-z]|\s)[.!?])+

在 Regexr 上查看。

这与字符不匹配.!?

但无论如何,当这些字符前面有来自这种交替的东西时,它们都会匹配etc|Dr|Mr|Mrs|\b[A-Za-z]|\s

于 2013-05-16T07:41:21.183 回答
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被选取为名称和标题。这仅适用于短名称(带有 5 个字符以下\w{0,4}4可以将其调整为更小的东西以过滤出更长的标题)除了了解什么是名称或标题之外,我想不出任何方法来解决这个问题。我想我的方法并不完美,但我认为它在大多数情况下已经足够接近了。

于 2014-05-14T04:41:47.230 回答