我正在寻找一个正则表达式来解析一个文本文件,其中句子以特殊字符结尾.
,但忽略 George W. Bush、Hopkins Mr. Violet 等单词!
。?
我试过(?!Mr|Mrs|[A-Za-z]\.\s)\S.+?[.!?](?=\s+|$)
了,但这似乎不起作用。
我正在寻找一个正则表达式来解析一个文本文件,其中句子以特殊字符结尾.
,但忽略 George W. Bush、Hopkins Mr. Violet 等单词!
。?
我试过(?!Mr|Mrs|[A-Za-z]\.\s)\S.+?[.!?](?=\s+|$)
了,但这似乎不起作用。
英语绝对是一种非常规语言。我认为一个正则表达式是不够的:你可能需要一个完整的标记器,加上某种机器学习,可能是马尔可夫模型,来检测一个句子的结尾和下一个句子的开始。即便如此,它也只是一种启发式方法——由于人类语言的使用是草率的,因此可能永远不可能有一个精确的解决方案。
正则表达式不能智能地识别什么是缩写,什么是句子的结尾。
正则表达式可以做的是定义一组标记句子结尾的字符,因此不匹配,并在这些字符无论如何都应该匹配时定义一组异常。
尝试:
([^.!?]|(?<=etc|Dr|Mr|Mrs|\b[A-Za-z]|\s)[.!?])+
在 Regexr 上查看。
这与字符不匹配.!?
但无论如何,当这些字符前面有来自这种交替的东西时,它们都会匹配etc|Dr|Mr|Mrs|\b[A-Za-z]|\s
我不是正则表达式专家,但我发现这个正则表达式可以很好地识别句子之间的中断。
(?<!\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
可以将其调整为更小的东西以过滤出更长的标题)除了了解什么是名称或标题之外,我想不出任何方法来解决这个问题。我想我的方法并不完美,但我认为它在大多数情况下已经足够接近了。