2016-12-08 2 views
2

Я использую gsub, чтобы заменить слова в векторе в R, следуя идее словаря. То есть, заданные множества слов (синонимы) syn = c("Cash", "\\$"), предполагается заменить словом (word = "MONEY").Regex R: текстовые и разделенные символы

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

До сих пор я использую это, чтобы заменить синонимы:

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), тогда будет найден $ -знак, но так же «Наличный» в «Кассе».

Вы знаете, как я могу иметь слово-границу, но также найти единственный $ -знак?

+0

Итак, вы ожидаете '[1] "Я потратил 100 $" "Деньги могут быть использованы" "кассир счетчика оленьей кожи" "отдельные ДЕНЬГИ"'? –

+0

Почти, я ожидаю 'c (« Я потратил 100MONEY »,« MONEY можно использовать »,« Cashier does not count »,« отдельный MONEY »)' – David

+0

Но '$' в первой строке предшествует цифра. Как определяются границы слов? Не внутри писем? –

ответ

2

Использование пользовательских границы с регулярным выражением PCRE:

  • (?<!\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

Я также рекомендую использовать * не захватывающую * группу ('(?: ...)') для обертывания альтернатив, так как вы не используете захват в любом месте, поэтому вам не нужно использовать группу * capture *. –

+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

Смежные вопросы