在R中解析字符串的数据

时间:2015-02-21 02:50:55

标签: regex r string parsing

我需要帮助来解决看似非常简单的问题。我有一个字符串,70 - 3/31/2014 - 60@1.66。我想解析第二个" - "之间的信息。在" @",即" 60"之前。 R中是否有任何公式或嵌套公式可以解析两个指定字符之间的字符串数据?

谢谢!

2 个答案:

答案 0 :(得分:3)

1)sub 这匹配整个字符串,然后将其替换为捕获组,即与括号中正则表达式部分匹配的部分:

x <- "70 - 3/31/2014 - 60@1.66"
sub(".*- (.*)@.*", "\\1", x)
## [1] "60"

以下是使用的正则表达式的可视化:

.*- (.*)@.*

Regular expression visualization

Debuggex Demo

2)gsub 这会将想要的子字符串之前的部分和想要的子字符串之后的部分替换为空字符串:

gsub(".*- |@.*", "", x)
# [1] "60"

其正则表达式可视化为:

.*- |@.*

Regular expression visualization

Debuggex Demo

答案 1 :(得分:1)

通过sub,

> x <- "70 - 3/31/2014 - 60@1.66"
> sub("^[^-]*-[^-]*-\\s*([^@]*)@.*", "\\1", x)
[1] "60"
> sub("^[^-]*-[^-]*-([^@]*)@.*", "\\1", x)
[1] " 60"
> sub("^(?:[^-]*-){2}\\s*([^@]*)@.*", "\\1", x)
[1] "60"
  • ^ - 断言我们刚开始。

  • [^-]*-匹配所有字符,但不匹配-,零次或多次以及以下连字符。

  • (?:[^-]*-){2} - 上述模式将重复两次。所以我们最终得到了第二个连字符。

  • \\s* - 匹配零个或多个空格字符。

  • ([^@]*) - 捕获@零次或多次的任何字符。

  • .* - 匹配所有剩余的字符。

因此,通过将所有匹配的字符替换为组索引1中的字符,将为您提供所需的输出。

> x <- "70 - 3/31/2014 - 60@1.66"
> m <- regexpr("^(?:[^-]*-){2}\\s*\\K[^@]*(?=@)", x, perl=TRUE)
> regmatches(x, m)
[1] "60"

\K使文本与整个正则表达式匹配保持匹配。