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

bar*_*ryq 1 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)")
Run Code Online (Sandbox Code Playgroud)

上面的代码返回短语开始和结束点的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 \n翡翠海岸的高级社区银行佛罗里达州克雷斯特维尤,总资产约1.26亿美元,总存款1.121亿美元已经关闭.佛罗里达州巴拿马城北领地银行已同意承担所有存款.\ r \n(PR-194-2011)"

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

Tim*_*ker 5

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

str_locate(x,"(\\b[Aa]pproximately\\b)(.*)(\\b[Cc]losed\\b)")
Run Code Online (Sandbox Code Playgroud)

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

最后,请注意,.*如果approximately和之间存在换行符,则不匹配(如果closed可以修复(?s)),如果字符串中存在多对关键字,则可能会产生不需要的结果.

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

str_locate(x, perl("(?is)\\bapproximately\\b(.*?)\\bclosed\\b"))
Run Code Online (Sandbox Code Playgroud)