我试着用正则表达式来计算文本中的句子数。我想出了一个regex1,找出了所有要点:
([^.!?\s][^.!?]*)在此之后,我试图通过以下regex2找到大多数缩略语:
([A-Z]+[a-z]{0,3}\.).然而,我有几个问题:
美国国家航空航天局(NASA)是负责民用空间计划以及航空和航天研究的美国政府机构。 德怀特·D·艾森豪威尔总统于19585成立了美国国家航空航天局(美国宇航局),其明确的民用(而非军事)方向鼓励了空间科学中的和平应用。1958年7月29日通过了“国家航空和空间法”,推翻了美国航天局的前身--国家航空咨询委员会(NACA)。新机构于1958.6年月一日开始运作。 从那时起,美国大部分的太空探索工作都是由美国宇航局领导的,包括阿波罗登月任务、太空实验室空间站以及后来的航天飞机。目前,美国宇航局正在支持国际空间站,并正在监督猎户座多用途机组人员飞行器、空间发射系统和商用机组人员飞行器的开发。该机构还负责发射服务计划(LSP),该计划为美国宇航局无人发射提供发射操作和倒计时管理。 美国航天局的科学重点是通过地球观测系统更好地了解地球,8通过科学任务管理局的太阳物理学研究方案推进太阳物理学,9在整个太阳系中探索具有先进机器人航天器任务的天体,如“新地平线”,10并通过“大爆炸”等天体物理学专题和相关方案进行研究。11美国航天局与各种国家和国际组织共享数据,例如温室气体观测卫星的数据。
以上课文共9句。
Regex1: 12场比赛(D.,U.和S.被认为是“全场”)
Regex2: 3场比赛(D、U、S.)
我现在需要的是一个更好的regex1公式,只在一个句子中找到缩略词,然后“合并”两个正则表达式来接收所有的句子。
如果合并这两个公式是不可能的(出于任何合理的原因),那么只考虑问题1,因为目前我的JAVA程序使用了这两个公式:
public void breakIntoSentences()
{
//Find all points
Pattern p = Pattern.compile("([^.!?\\s][^.!?]*)");
Matcher m = p.matcher(content);
int allPoints = 0;
while(m.find())
allPoints++;
//Find all acronyms with length 0-4
p = Pattern.compile("([A-Z]+[a-z]{0,3}\\.)");
m = p.matcher(content);
int allAcronyms = 0;
while(m.find())
allAcronyms++;
numberOfSentences = allPoints - allAcronyms;
}提前感谢您的帮助
发布于 2015-04-16 11:45:04
下面是一个模式:
.+?(?:(?<![\s.]\p{Lu})[.!?]|$).+?来这里只是为了匹配一个完整的句子。如果您只想要一个计数,可以用.替换它。(?<![\s.]\p{Lu})的意思是在大写字母本身之前没有空格或句点。这是在[.!?]之前使用的,它检查句子的结尾。这似乎处理好了首字母缩略词。$只是在开始时强制非贪婪的.+?匹配,直到文本的末尾,以防文本没有以句点结束。这个正则表达式将[6][7]作为下一句的一部分来处理。如果这是不可接受的,您可以通过在[\d\[\]]*后面添加[.!?]来稍微修改模式。
发布于 2015-04-16 11:51:43
看上去你想要的只是在这段时期之前没有资本的东西。这很容易做到:
((?:[A-Z]\.|[^\.!?])+)[\.!?]这使用任何非句子结尾符号或大写后面的句号的选项。
多个字符还允许您避免记录以下三句话:
就像这样..。
https://stackoverflow.com/questions/29673147
复制相似问题