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

前端 未结 4 1301
自闭症患者
自闭症患者 2020-12-03 22:01

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

but

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

[1] \"I\"     \"am\"    \"|\"              


        
相关标签:
4条回答
  • 2020-12-03 22:25

    | 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 . \ | ( ) [ { ^ $ * + ?

    0 讨论(0)
  • 2020-12-03 22:31

    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!

    0 讨论(0)
  • 2020-12-03 22:31

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

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

    0 讨论(0)
  • 2020-12-03 22:37

    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(" | ")))
    
    0 讨论(0)
提交回复
热议问题