开发者

How to strsplit using '|' character, it behaves unexpectedly?

开发者 https://www.devze.com 2023-03-13 11:12 出处:网络
I would like to split a string of character at pattern \"|\" but unlist(strsplit(\"I am | very smart\", \" | \"))

I would like to split a string of character at pattern "|"

but

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

[1] "I"  开发者_运维技巧   "am"    "|"     "very"  "smart"

or

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

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


The problem is that by default strsplit interprets " | " as a regular expression, in which | has special meaning (as "or").

Use fixed argument:

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

Side effect is faster computation.

stringr alternative:

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


| is a metacharacter. You need to escape it (using \\ before it).

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

Edit: The reason you need two backslashes is that the single backslash prefix is reserved for special symbols such as \n (newline) and \t (tab). For more information look in the help page ?regex. The other metacharacters are . \ | ( ) [ { ^ $ * + ?


If you are parsing a table than calling read.table might be a better option. Tiny example:

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

So I would suggest to fetch the wiki page with Rcurl, grab the interesting part of the page with XML (which has a really neat function to parse HTML tables also) and if HTML format is not available call read.table with specified sep. Good luck!


Pipe '|' is a metacharacter, used as an 'OR' operator in regular expression.

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

0

精彩评论

暂无评论...
验证码 换一张
取 消