2012-09-25 20 views
1

我试图通过使用下面的代码找到(然后提取)重复的短语。我需要以“大约”开始并以“关闭”结尾的短语。使用正则表达式在R中提取重复的短语

例如“总资产约为1.629亿$,并在总存款$ 144.5万元关闭”

str_locate(x,"(\b[Aa]pproximately\b)(.*)(\b[Cc]losed\b)")

str_extract(x,"(\b[Aa]pproximately\b)(.*)(\b[Cc]losed\b)") 

上面的代码返回NA词组起点和终点。 这里是短语所在的字符向量的示例(它是公开可用的FDIC信息的网页)

“206-4662)。\ r \ n \ r \ n十二月\ r \ n \ r \ n \ r \ n美国亚利桑那州凤凰城西部国家银行的总资产约为1.629亿美元,总存款为1.445亿美元。华盛顿联邦华盛顿州西雅图已同意承担除某些代理存款以外的所有存款。\ r \ n (PR-195-2011)\ r \ n \ r \ n \ r \ n翡翠海岸首席社区银行位于佛罗里达州Crestview,总资产约为1.26亿美元,总存款为1.121亿美元。 (PR-194-2011)“

我可能会使用reg表达式incorrec因为我是新来的,所以任何建议非常赞赏。

回答

5

\b是ASCII退格。你需要,如果你想它的意思是“单词边界”逃离反斜杠:

str_locate(x,"(\\b[Aa]pproximately\\b)(.*)(\\b[Cc]losed\\b)") 

而且,你不需要括号为关键字,除非以后要检查他们的资本。当为正则表达式使用perl()函数时,您可以不区分大小写地与(?i)修饰符进行匹配。

最后,注意,如果有approximatelyclosed之间换行符(这可以固定(?s).*将不匹配,并且它可能会产生不想要的结果,如果多于一对的关键字存在于串英寸

因此,你应该改变你的正则表达式来

str_locate(x, perl("(?is)\\bapproximately\\b(.*?)\\bclosed\\b")) 
+0

感谢迅速的反应蒂姆,你能就如何涵盖str_locate内perl的功能可能会详细说明()?这个特定的软件包似乎没有在其中的Perl选项 – barryq

+0

@ user1176697:它不是?但是[在手册中]描述了它(http://cran.r-project.org/web/packages/stringr/stringr.pdf),第4页。 –