如何使用'|'进行strsplit性格,它出乎意料地表现?

时间:2011-06-17 07:02:03

标签: r regex string special-characters

我想在模式“|”

中分割一串字符

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*"

4 个答案:

答案 0 :(得分:16)

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

> 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。其他元字符是. \ | ( ) [ { ^ $ * + ?

答案 1 :(得分:16)

问题在于默认情况下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 :(得分:5)

如果要解析而不是调用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。祝你好运!

答案 3 :(得分:1)

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

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