在R中是否有一种方法可以根据模式的开头和结尾提取数据,而不是中间数据?

时间:2017-01-24 05:07:21

标签: r string match

在R中有没有办法根据模式的开头和结尾提取数据,而不是中间数据?

即。如果以下是在一个单元格中

(1) Number = '1111111111, 0000000000' Text =....
(2) Number = '0000000000' Text =....

它会导致:

(1) 1111111111, 0000000000
(2) 0000000000

我试过了:

x1<-str_match(x,"(?<=Number'\\s\\=\\s\\')(\\d|\\s|\\,)\\d\\'")

但这不起作用。

2 个答案:

答案 0 :(得分:0)

我们可以尝试str_extract_all

library(stringr)
sapply(str_extract_all(x, "[0-9]+"), toString)
#[1] "1111111111, 0000000000" "0000000000"  

答案 1 :(得分:0)

您可以使用PCRE正则表达式从输入文本中提取Number='后的数字:

(?:Number\s*=\s*'|\G(?!\A)\s*,\s*)\K\d+

请参阅regex demo

模式详情

  • (?:Number\s*=\s*'|\G(?!\A)\s*,\s*) - 两种选择中的任何一种:
    • Number\s*=\s*' - Number以及包含0 +空格的=
    • | - 或
    • \G(?!\A)\s*,\s* - 上一次成功匹配(\G(?!\A))的结束以及用0 +空格(\s*)括起来的逗号
  • \K - 省略目前为止匹配的文字
  • \d+ - 1+位数(作为匹配项返回)

请参阅R demo

> x <- c("(1) Number = '1111111111, 0000000000' Text =....", "(2) Number = '0000000000' Text =....")
> regmatches(x, gregexpr("(?:Number\\s*=\\s*'|\\G(?!\\A)\\s*,\\s*)\\K\\d+", x, perl=TRUE))
[[1]]
[1] "1111111111" "0000000000"

[[2]]
[1] "0000000000"