正则表达式正好用4个分号排列

时间:2014-11-18 12:51:42

标签: regex r grep

我想过滤掉恰好有4个分号的行。

不应处理或多或少的分号。我正在使用regex / grep:

积极的例子:

VES_I.MG;A;97;13;1

负面例子:

VES_I.MG;A;97;13;1;2

7 个答案:

答案 0 :(得分:3)

对于这个直截了当的事情,我实际上只是建议根据该数字向量计算分号和子集。

快速执行此操作的方法是使用来自" stringi"的stri_count*。包:

library(stringi)
v <- c("VES_I.MG;A;97;13;1", "VES_I.MG;A;97;13;1;2")  ## An example vector
stri_count_fixed(v, ";")                         ## How many semicolons?
# [1] 4 5
v[stri_count_fixed(v, ";") == 4]                 ## Just keep when count == 4
# [1] "VES_I.MG;A;97;13;1"

答案 1 :(得分:2)

[编辑:修正了愚蠢的错误......]

以下内容适用于grep或任何正则表达式引擎:

^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$

在命令行中使用时,请确保将其放在引号内("在Windows上;要么在* nix上),以便shell不会解释特殊字符。

答案 2 :(得分:2)

^(?=([^;]*;){4}[^;]*$).*$

如果您对grep -P有支持,可以尝试使用{{1}}。请参阅演示。

http://regex101.com/r/lZ5mN8/22

答案 3 :(得分:2)

如果您有awk,也可以尝试:

awk -F';' 'NF==5' file

只需将5替换为n + 1即可。其中n是您的目标点数,例如您问题中的4

答案 4 :(得分:1)

您不需要使用前瞻,也不需要启用perl=TRUE参数。

> v <- c("VES_I.MG;A;97;13;1", "VES_I.MG;A;97;13;1;2")
> grep("^(?:[^;]*;){4}[^;]*$", v)
[1] 1
> grep("^(?:[^;]*;){4}[^;]*$", v, value=TRUE)
[1] "VES_I.MG;A;97;13;1"

答案 5 :(得分:0)

要准确匹配一行中的四个分号,请使用正则表达式^([^;]*;){4}[^;]*$ grep:

grep -P "^([^;]*;){4}[^;]*$" ./input.txt

答案 6 :(得分:0)

使用count.fields可以在没有正则表达式的情况下完成此操作。第一行给出计数,第二行读取行,并将其减少到具有5个字段的行。最后一行解析出字段并将其转换为一个包含4列的数据框。

 cnt <- count.fields("myfile.dat", sep = ";")
 L <- readLines("myfile.dat")[cnt == 5]

 read.table(text = L, sep = ";")