在具有多个子表达式的grep中使用正则表达式模式

时间:2017-01-03 20:50:06

标签: r regex

有很多关于正则表达式的阅读,我已经掩盖了一些,并花了很多时间,但现在我希望有人给我建议和方向进一步学习正则表达式。

我正在使用grep在我的数据集SCC的任何列中查找具有机动车辆参考的行。所以我使用以下命令:

sapply(SCC, grep, pattern="(vehicle|motor.*vehicle|motor)", 
    ignore.case = TRUE,
    fixed = FALSE)

我得到了所有可能感兴趣的列中所有行的列表。

然后我使用了grep()的value=TRUE参数和unlist(unique())来查看所有行的捕获情况。

以下是使用该命令的一些条目:

   unique(unlist(sapply(SCC, grep, pattern="(vehicle|motor.*vehicle|motor)", ignore.case=TRUE, fixed=FALSE, value=TRUE)))
        [1] "Int Comb /Engine Testing /Rocket Engine Testing /Rocket Motor: Solid Propellant"
        [2] "Highway Veh - Gasoline - Light Duty Vehicles (LDGV) - Total: All Road Types"
        [3] "Highway Veh - Gasoline - Light Duty Vehicles (LDGV) - Rural Interstate: Total"
        [4] "Highway Veh - Gasoline - Light Duty Vehicles (LDGV) - Interstate: Rural Time 1"
        [5] "Highway Veh - Gasoline - Light Duty Vehicles (LDGV) - Interstate: Rural Time 2"     
        .
        .
        .
    [329] "Off-highway Gasoline, 4-Stroke /Recreational Equipt /Motorcycles: Off-road"
    [330] "Off-highway Gasoline, 4-Stroke /Recreational Equipt /All Terrain Vehicles"
    [331] "Off-highway Gasoline, 4-Stroke /Recreational Equipt /Specialty Vehicles/Carts"
    [332] "Off-highway LPG /Recreational Equipt /Motorcycles: Off-road"

总共有411个唯一条目是我的grep所针对的(车辆电机。*车辆电机)。我想改变这一点,以便使用字符串' Rocket Motor'不包括在内。所以,我使用这种模式="(车辆|电机。*车辆)"。

我得到了我想要的东西,但我很好奇是否有办法使用正则表达式来匹配只有独占字符串。我读了一些关于使用正则表达式并尝试使用类似的东西:

pattern = "^(?=.*?vehicle|motor.*vehicle|motor)((?!\brocket motor\b).)*$"

我试图将所有东西与车辆,机动车或电动机匹配,但不是“火箭发动机”。它没有用,我收到了错误。我想更多地了解R中正则表达式的用法,尤其是grep和相关函数。我使用有意义的正则表达式有多接近或有多远?我特别可以用于R的正则表达式类型是否有限制?我知道将来我会使用正则表达式,并希望从我的所有努力中学到更多东西。

以下是我得到的错误:

Error in FUN(X[[i]], ...) : 
  invalid regular expression '^(?=.*vehicle|motor.*vehicle|motor)((?rocket moto).)*$', reason 'Invalid regexp'

1 个答案:

答案 0 :(得分:3)

有关基础R中正则表达式的更多信息,请参阅?regex

关于您遇到的错误,请参阅详细信息部分。第二句是:

  

R,扩展常规中使用两种类型的正则表达式   表达式(默认)和类似Perl的正则表达式   perl = TRUE。

由于您尝试使用类似Perl的正则表达式,因此需要设置perl = TRUE

在“详细信息”部分之后,有一个“扩展正则表达式”部分,后跟一个类似Perl的正则表达式部分,您可以在其中找到更多信息。

对于更多正则表达式选项,您还可以使用查看使用ICU库的stringi包。