【问题标题】:R Regex: Parenthesis Not Acting as MetacharacterR 正则表达式:括号不充当元字符
【发布时间】:2014-02-04 15:08:16
【问题描述】:

我正在尝试按组“%in%”和字符“@”来拆分字符串。所有文档和我能找到的所有内容都表明括号是用于在 R 正则表达式中进行分组的元字符。所以代码

    > strsplit('example%in%aa(bbb)aa@cdef', '[(%in%)@]', perl=TRUE)

应该给我

    [[1]]
    [1] "example" "aa(bbb)aa"      "cdef"

也就是说,它应该只保留“aa(bbb)aa”中的括号,因为匹配表达式中的括号没有被转义。但它实际上给了我

    [[1]]
    [1] "example" ""   ""    ""    "aa"    "bbb"   "aa"    "cdef"

好像括号不是元字符!这是怎么回事,我该如何解决?谢谢!

在 strsplit 中无论有无参数 perl=TRUE 都是如此。

【问题讨论】:

  • 字符类翻译为Each character stands alone。你所拥有的相当于(?: \( | % | i | n | @ | \) )

标签: regex r metacharacters


【解决方案1】:

不确定您正在阅读什么文档,但?regex 中的扩展正则表达式部分说:

大多数元字符在字符类中失去了它们的特殊含义。 ... (只有 '^ - \ ]' 在字符类中是特殊的。)

您不需要创建角色类。只需使用“或”|(您可能也不需要将"%in%" 分组,但它不应该伤害任何东西):

> strsplit('example%in%aa(bbb)aa@cdef', '(%in%)|@', perl=TRUE)
[[1]]
[1] "example"   "aa(bbb)aa" "cdef"

【讨论】:

    【解决方案2】:

    这里不需要使用[(,就这个:

    strsplit('example%in%aa(bbb)aa@cdef', '%in%|@')
    [[1]]
    [1] "example"   "aa(bbb)aa" "cdef"     
    

    【讨论】:

    • 那么[|有什么区别呢?
    • 不确定这是否会有所帮助,但[ 是一个字符类,| 是 or 运算符...
    【解决方案3】:

    在字符类[]中,大部分字符都失去了特殊意义,包括()

    您可能需要这个正则表达式:

    '%in%|@'
    

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多