【问题标题】:How to strsplit using '|' character, it behaves unexpectedly?如何使用'|'进行strsplit字符,它的行为出乎意料?
【发布时间】:2011-09-16 23:12:55
【问题描述】:

我想在模式“|”处分割一个字符串

但是

unlist(strsplit("I am | very smart", " | "))

[1] "I"     "am"    "|"     "very"  "smart"

gsub(pattern="|", replacement="*", x="I am | very smart")    

[1] "*I* *a*m* *|* *v*e*r*y* *s*m*a*r*t*"

【问题讨论】:

    标签: r regex string special-characters


    【解决方案1】:

    问题在于默认情况下strsplit" | " 解释为正则表达式,其中| 具有特殊含义(如“或”)。

    使用fixed 参数:

    unlist(strsplit("I am | very smart", " | ", fixed=TRUE))
    # [1] "I am"       "very smart"
    

    副作用是计算速度更快。

    stringr 替代:

    unlist(stringr::str_split("I am | very smart", fixed(" | ")))
    

    【讨论】:

      【解决方案2】:

      | 是一个元字符。你需要转义它(在它之前使用\\)。

      > unlist(strsplit("I am | very smart", " \\| "))
      [1] "I am"       "very smart"
      > sub(pattern="\\|", replacement="*", x="I am | very smart")
      [1] "I am * very smart"
      

      编辑:您需要两个反斜杠的原因是单个反斜杠前缀是为特殊符号保留的,例如\n(换行符)和\t(制表符)。有关更多信息,请查看帮助页面 ?regex。其他元字符是. \ | ( ) [ { ^ $ * + ?

      【讨论】:

      • 谢谢!!!但是你怎么知道我们需要 2 个反斜杠呢?我只试过一个。
      【解决方案3】:

      如果您正在解析 表格,那么调用 read.table 可能是更好的选择。小例子:

      > txt <- textConnection("I am | very smart")
      > read.table(txt, sep='|')
           V1          V2
      1 I am   very smart
      

      所以我建议使用 Rcurl 获取 wiki 页面,使用 XML 获取页面中有趣的部分(它也有一个真正的 neat function 来解析 HTML 表),如果 HTML 格式不可用,请调用read.table 与指定的 sep。祝你好运!

      【讨论】:

        【解决方案4】:

        管道'|'是一个元字符,在正则表达式中用作“或”运算符。

        试试 unlist(strsplit("I am | very smart", "\s+\|\s+"))

        【讨论】:

        • 再次,我必须添加 2 个反斜杠才能使其工作: unlist(strsplit("I am | very smart", "\\s+\\|\\s+"))
        猜你喜欢
        • 1970-01-01
        • 2022-01-27
        • 2015-03-01
        • 2015-06-25
        • 1970-01-01
        • 2012-06-06
        • 2019-08-12
        • 2014-05-30
        • 1970-01-01
        相关资源
        最近更新 更多