使用正则表达式匹配给定直方图的字符串(任何顺序中某些字符的出现次数)

时间:2016-04-15 21:12:03

标签: regex grep

是否可以使用正则表达式来匹配某些字符出现一定数量的字符串?

例如,我想找到所有包含1'a'和2'l'的单词。因此,以下词语将匹配:all,allow,tall,pallet,liability。

下面的示例只会找到序列中包含1'a'和2'l'的模式,而不是字符串中的任何顺序和位置。

echo -e "all\nallow\ntall\npallet\nliability" | grep 'a\{1\}l\{2\}'

2 个答案:

答案 0 :(得分:1)

awk 'gsub(/a/,"&")==1 && gsub(/l/,"&")==2' file

答案 1 :(得分:0)

在具有无限前瞻性的引擎上,这应该起作用:

add_rows

说明:

如果字符串中没有library(data.table) #version 1.10+ #Helper function to add extra rows add_rows <- function(DT, n, fill='') { rbindlist(list(DT, data.table(myfile=rep(fill,n), Myname=rep(fill,n)))) } #Remove first column lst2 <- lapply(my.list, function(x) x[, c("myfile", "myname")]) #if using version <= 1.9.8, x[, -1, with=FALSE] #data table with most rows len <- max(sapply(lst2, nrow)) #Add rows lst3 <- lapply(lst2, function(x) add_rows(x, len-nrow(x))) #Order rows #braces have backslashes added because without them those characters have special meaning in searches tofind <- c("13C\\(6\\)15N\\(4\\)", "13C\\(6\\)") lst4 <- lapply(lst3, function(DT) { pattern <- paste0(tofind, collapse="|") moveup <- DT[, grep(pattern, myfile)] myorder <- c(moveup, setdiff(1:nrow(DT), moveup)) DT[myorder] }) #Combine data newdf <- do.call('cbind', lst4) #Update names setnames(newdf, paste0(names(newdf), rep(1:table(names(newdf))[1], each=2))) newdf ,则

(?=[^a]*a)(?=[^l]*l[^l]*l).* 会失败。

如果字符串中没有(?=[^a]*a),则

a会失败。

(?=[^l]*l[^l]*l)与实际字符串匹配。

但我不确定l是否支持此功能。