【问题标题】:Using regular expression to extract repeated phrase in R使用正则表达式提取R中的重复短语
【发布时间】:2012-09-25 10:16:24
【问题描述】:

我正在尝试使用以下代码定位(然后提取)重复的短语。我需要以“大约”开头并以“关闭”结尾的短语。

例如“关闭了大约 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\n12 月 \r\n\r\n\r\n 位于亚利桑那州凤凰城的 Western National Bank,总资产约为 1.629 亿美元,总存款为 1.445 亿美元已关闭。华盛顿州西雅图市华盛顿联邦银行已同意承担除某些经纪存款外的所有存款。\r\n(PR-195-2011) \r\n\r\n\r\n\r\n Premier Community Bank of Emerald Coast, Crestview, FL 已关闭,总资产约为 1.26 亿美元,存款总额为 1.121 亿美元。Summit Bank, N.A., Panama City, FL 已同意承担所有存款。\r\n(PR-194-2011) "

我可能不正确地使用 reg 表达式,因为我是新手,因此非常感谢任何建议。

【问题讨论】:

    标签: regex r stringr


    【解决方案1】:

    \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"))
    

    【讨论】:

    • 感谢蒂姆的快速回复,您能否详细说明如何在 str_locate() 中包含 perl 函数?这个特定的包似乎没有 perl 选项
    • @user1176697:不是吗?但它被描述为in the manual,第 4 页。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2022-10-15
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多