我试图通过使用下面的代码找到(然后提取)重复的短语。我要求以“大约”开头并以“关闭”结尾的短语。
例如,“总资产约为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表达错误,因为我是新手,所以任何建议都非常赞赏。
答案 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"))