【问题标题】:R Regex: find string preceding a matching string [closed]R正则表达式:查找匹配字符串之前的字符串[关闭]
【发布时间】:2013-07-11 22:49:30
【问题描述】:
x <- "what I want to get is THAT THIS is always following"

如何提取在 R 中始终位于字符串 'THIS' 之前的字符串? THAT 实际上是一个从 0 到 inf 的数字,带有不同的小数分隔符、逗号或点。

【问题讨论】:

  • \S*(?= THIS ) ?如果 r 支持前瞻.. 不熟悉 r.

标签: regex r


【解决方案1】:

OP 您的 THIS 和 THAT 令人困惑,考虑改写 OP,this 您在寻找什么?

x <- "what I want to get is THAT THIS is always following"

sub('.* ([^ ]+) THIS .*', '\\1', x)
# [1] "THAT"

【讨论】:

  • 抱歉 - 我在改写 OP 时搞混了,之前没有注意到。措辞现在应该很清楚了..
  • 所有答案都很好 - 但是,这对我来说是最直观的。谢谢!
【解决方案2】:

\\S*(?= THIS) 因为 R 确实在 perl 模式下支持 positive and negative lookaheads using this syntax,只需将 perl = TRUE 添加到您的函数调用中,您就应该是金色的。但是,如果您不是,请发表评论。

首先,您必须将 R 中的 \S 转义为 \\S。然后,您可以使用regexpr,它将为您提供匹配的位置(开始和结束)(如果不匹配,则为-1),然后您可以使用regmatches 提取该值。那就是:

regmatches(x, regexpr("\\S*(?= THIS )", x, perl=TRUE))
# [1] "THAT"

【讨论】:

  • +1 是唯一一个费心解释你的答案是如何工作的人。我认为这对未来的访问者最有用。
  • @SimonO101,你错过了所有的戏剧:)。
  • +1 - 感谢您详细说明 R 中的前瞻方法!
  • @Arun 添加了解释;所以他真的应该得到赞扬。
【解决方案3】:

使用gsubfn包中的strapplyc可以使用比较简单的正则表达式:

> library(gsubfn)
> strapplyc(x, "(\\S+) THIS", simplify = TRUE)
[1] "THAT"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多