使用正则表达式提取R中的重复短语

时间:2012-09-25 10:16:24

标签: regex r stringr

我试图通过使用下面的代码找到(然后提取)重复的短语。我要求以“大约”开头并以“关闭”结尾的短语。

例如,“总资产约为1.629亿美元,总存款为1.445亿美元已被关闭”

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 12月\ r \ n \ r \ n \ r \ n \ n西部国家银行,亚利桑那州凤凰城,总资产约为1.629亿美元,总存款为1.445亿美元华盛顿联邦,华盛顿州西雅图已同意承担所有存款,不包括某些经纪存款。\ r \ n(PR-195-2011)\ r \ n \ r \ n \ r \ n \ r \ n佛罗里达州克雷斯特维尤的翡翠海岸总资产约为1.26亿美元,总存款为1.121亿美元。佛罗里达州巴拿马城的Summit Bank已同意承担所有存款。\ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \¥(PR-194-2011) “

我可能正在使用reg表达错误,因为我是新手,所以任何建议都非常赞赏。

1 个答案:

答案 0 :(得分:5)

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

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

此外,您不需要围绕关键字的括号,除非您想稍后检查其大小写。在为正则表达式使用(?i)函数时,您可以使用perl()修饰符区分大小写。

最后,请注意,如果.*approximately之间有换行符,closed将无法匹配(这可以通过(?s)修复),并且可能会产生不需要的内容如果字符串中存在多对关键字,则会产生结果。

因此,您应该将正则表达式更改为

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