从R中的字符串中提取特定模式(4位数字,' - ',1数字)

时间:2016-02-18 11:07:03

标签: regex r

想象一下以下字符串:

x <- "aokizoizeon1854-1zeoijzeoinq1234-2zeze

我想从这个字符串中提取出1854-1&#39;和&#39; 1234-2&#39;。所以基本上字符串的每个部分都由4位数字组成,后跟一个&#39; - &#39;再一位数。

最简单的方法是什么?

2 个答案:

答案 0 :(得分:3)

可能的base解决方案可能是删除所有字符,然后将数字拆分为单独的字符串:

x1 <- gsub("[a-z]", "", x)
substring(x1, seq(1,nchar(x1),6), seq(6, nchar(x1), 6))
#[1] "1854-1" "1234-2"

答案 1 :(得分:2)

您可以使用来自stringr包的str_extract_all和PCRE正则表达式。

如果您的字符串可以包含长于4的数字序列,并且您想要匹配完全 4位数序列后跟一个连字符然后完全一位数,您将需要 lookarounds 来精确匹配:

> library(stringr)
> x <- "aokizoizeon1854-1zeoijzeoinq1234-2zeze12445664-345ff"
> unlist(str_extract_all(x, "(?<!\\d)\\d{4}-\\d(?!\\d)"))
[1] "1854-1" "1234-2"

(?<!\\d)\\d{4}-\\d(?!\\d)正则表达式匹配:

  • (?<!\\d) - 如果当前位置之前有一位数字,则匹配失败
  • \\d{4}-\\d - 匹配4位数字后跟连字符和1位数字
  • (?!\\d) - 但如果一个数字跟随另一个数字,则匹配失败。