14

単語と終了記号 (特定の種類の句読点) で分割する必要があります。奇妙なことに、パイプ ("|") は終了マークとして数えることができます。パイプを追加しようとするまで、エンドマークに単語を付けるコードがあります。パイプを追加すると、strsplitすべての文字が作成されます。エスケープすると、エラーが発生します。正規表現にパイプを含めるにはどうすればよいですか?

x <- "I like the dog|."

strsplit(x, "[[:space:]]|(?=[.!?*-])", perl=TRUE)
#[[1]]
#[1] "I"    "like" "the"  "dog|" "."   

strsplit(x, "[[:space:]]|(?=[.!?*-\|])", perl=TRUE)
#Error: '\|' is an unrecognized escape in character string starting "[[:space:]]|(?=[.!?*-\|"

私が望む結果:

#[[1]]
#[1] "I"    "like" "the"  "dog"  "|"  "."  #pipe is an element
4

2 に答える 2

19

これを解決する 1 つの方法は、\Q...\E表記法を使用して の文字の特別な意味を取り除くこと...です。それが言うように?regex

文字列から特別な意味を取り除きたい場合は、'\Q' と '\E' の間に入れることで削除できます。これは Perl とは異なり、PCRE では '\Q...\E' シーケンスで '$' と '@' がリテラルとして扱われますが、Perl では '$' と '@' は変数補間を引き起こします。

例えば:

> strsplit(x, "[[:space:]]|(?=[\\Q.!?*-|\\E])", perl=TRUE)
[[1]]
[1] "I"    "like" "the"  "dog"  "|"    "."
于 2012-10-17T18:44:59.137 に答える
12

問題は実際にはハイフンであり、最初または最後に来る必要があります:

strsplit(x, "[[:space:]]|(?=[|.!?*-])", perl=TRUE)
strsplit(x, "[[:space:]]|(?=[.|!?*-])", perl=TRUE)
strsplit(x, "[[:space:]]|(?=[.!|?*-])", perl=TRUE)
strsplit(x, "[[:space:]]|(?=[-|.!?*])", perl=TRUE)

などなど、すべてが探している出力を提供するはずです。

必要に応じてハイフンをエスケープすることもできますが、2つの円記号を使用することを忘れないでください。

strsplit(x, "[[:space:]]|(?=[.!?*\\-|])", perl=TRUE)
于 2012-10-17T18:35:20.343 に答える