2016-12-08 22 views
2

私はgsubを使用して、辞書のアイデアに従ってR内のベクトルの単語を置き換えます。つまり、与えられた単語(同義語)のセットsyn = c("Cash", "\\$")は、単語(word = "MONEY")に置き換えられます。これまでのところ、私は同義語を置き換えるために、これを使用しています正規表現R:単語境界と区切り文字

text <- c("I spent 100$", "Cash can be used", "Cashier doesnt count", "a separate $") 

$ -signは英数字に添付されている場合に動作しますが、符号が分離されている場合は失敗し
syn <- c("Cash", "\\$") 
word <- "MONEY" 

regex <- paste0("\\b(", paste(syn, collapse = "|"), ")\\b") 
# "\\b(Cash|\\$)\\b" 

gsub(regex, word, text) 
# "I spent 100MONEY"  "MONEY can be used" "Cashier doesnt count" "a separate $" 

。単語境界(\\b)を放棄すると、$ -signが見つかりますが、 "キャッシャー"には "Cash"もあります。

私は単語境界を持つことができますが、1つの$記号を見つけることも知っていますか? PCRE正規表現と

+0

だから、あなたが期待 '[1] "MONEY" は "別々のお金を"' "キャッシャーdoesntの数を" 使用することができ、 "私は100 $を費やしましたか"? –

+0

ほとんどの場合、私は '' 100MONEY "、" MONEY使用可能 "、"キャッシャーdoesntカウント "、"別途金額 ")' – David

+0

を期待しています。しかし、最初の文字列の '$'の前に数字が付きます。ここでは単語境界はどのように定義されていますか?文字の中にない? –

答えて

2

使用カスタム境界:

  • (?<!\p{L}) - 単語の終わり(後に文字無し)

を参照してください - ワード(前文字無し)

  • (?!\p{L})の始まりregex demo

    サンプルRコード:

    > text <- c("I spent 100$", "Cash can be used", "Cashier doesnt count", "a seperate $") 
    > syn <- c("Cash", "\\$") 
    > word <- "MONEY" 
    > regex <- paste0("(?<!\\p{L})(?:", paste(syn, collapse = "|"), ")(?!\\p{L})") 
    > gsub(regex, word, text, perl=TRUE) 
    [1] "I spent 100MONEY"  "MONEY can be used" "Cashier doesnt count" "a seperate MONEY"  
    > 
    
  • +0

    キャプチャを使用していないので、キャプチャしない*グループ( '(?:...)')を使用することをお勧めします。 –

    +0

    すばらしい、それは仕事をする、非常に速い答えをありがとう! – David

    0
    regex <- paste0("\\b", paste(syn, collapse = "\\b|")) 
    #"\\bCash\\b|\\$" 
    gsub(regex,word,text) 
    #[1] "I spent 100MONEY"  "MONEY can be used" "Cashier doesnt count" "a seperate MONEY" 
    
    +0

    これは質問を解決するためのコードを提供するかもしれませんが、このコードが何をしているのか、それがどのように問題を解決するのかの説明を追加した方がずっと便利です。 – AdrianHHH

    関連する問題