想象一下以下字符串:
x <- "aokizoizeon1854-1zeoijzeoinq1234-2zeze
我想从这个字符串中提取出1854-1&#39;和&#39; 1234-2&#39;。所以基本上字符串的每个部分都由4位数字组成,后跟一个&#39; - &#39;再一位数。
最简单的方法是什么?
答案 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)
- 但如果一个数字跟随另一个数字,则匹配失败。