我想在模式“|”
中分割一串字符但
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*"
答案 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+"))