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

Roc*_*nce 7 regex string r special-characters

我想在模式"|"处分割一串字符

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

[1] "I"     "am"    "|"     "very"  "smart"
Run Code Online (Sandbox Code Playgroud)

要么

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

[1] "*I* *a*m* *|* *v*e*r*y* *s*m*a*r*t*"
Run Code Online (Sandbox Code Playgroud)

nul*_*lob 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"
Run Code Online (Sandbox Code Playgroud)

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

  • @RockScience你需要两个原因,一个是元字符. (4认同)

Mar*_*rek 16

问题是默认情况下strsplit将其解释" | "为正则表达式,其中|具有特殊含义(如"或").

使用fixed参数:

unlist(strsplit("I am | very smart", " | ", fixed=TRUE))
# [1] "I am"       "very smart"
Run Code Online (Sandbox Code Playgroud)

副作用是更快的计算.

stringr 替代方案:

unlist(stringr::str_split("I am | very smart", fixed(" | ")))
Run Code Online (Sandbox Code Playgroud)


dar*_*zig 5

如果要解析表而不是调用read.table可能是更好的选择.小小的例子:

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

所以我建议用Rcurl获取wiki页面,用XML抓取页面的有趣部分(它有一个非常简洁的函数来解析HTML表格),如果HTML格式不可用,则调用read.table指定的sep.祝好运!