Заменить слова в строке словами, определенными как значения в хэше - PullRequest
0 голосов
/ 27 февраля 2019

Цель состоит в том, чтобы заменить определенные слова в строке значениями, определенными в словаре.

dictionary =
    {"Hello" => "hi",
    "to, two, too" => "2",
    "for, four" => "4",
    "be" => "b",
    "you" => "u",
    "at" => "@",
    "and" => "&"
}

def word_substituter(tweet)
    tweet_array = tweet.split(',') ##converting the string to array
    tweet_array.each do |word|
        if word === dictionary.keys ##if the words of array are equal to the keys of the dictionary
         word == dictionary.values ##then now the words are now the the values of the dictionary
         puts word
        end
      end 
    word.join(", ")
end

word_substituter("Hey guys, can anyone teach me how to be cool? I really want to be the best at everything, you know what I mean? Tweeting is super fun you guys!!!!")

Буду признателен за помощь.Не могли бы вы объяснить это?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Мне кажется, что это довольно простое решение:

DICTIONARY = {
  "Hello" => "hi",
  "to, two, too" => "2",
  "for, four" => "4",
  "be" => "b",
  "you" => "u",
  "at" => "@",
  "and" => "&"
}.freeze

def word_substituter(tweet)
  tweet.dup.tap do |t|
    DICTIONARY.each { |key, replacement| t.gsub!(/\b(#{key.split(', ').join('|')})\b/, replacement) }
  end
end

word_substituter("Hey guys, can anyone teach me how to be cool? I really want to be the best at everything, you know what I mean? Tweeting is super fun you guys!!!!")

# => "Hey guys, can anyone teach me how 2 b cool? I really want 2 b the best @ everything, u know what I mean? Tweeting is super fun u guys!!!!"

Разбить его на этапы:

  • метод принимает твит и создает копию
  • он передает это tap, поэтому он возвращается из вызова метода
  • , он перебирает DICTIONARY
  • , преобразует key врегулярное выражение (например, /\b(to|two|too)\b/)
  • передает это в gsub! и заменяет любые совпадения на replacement

Если вы хотите заменить этоВхождение в слова (например, what => wh@), вы можете удалить проверки границ слов (\b) в регулярном выражении.

Одна ошибка заключается в том, что если любой из ключей вашего словаря содержит совпадения регулярных выражений, это потребуетНебольшая переделка: если бы у вас было "goodbye." => 'later xxx', точка соответствовала бы любому символу и включала бы его в заменяемое.Regexp.escape ваш друг здесь.

Надеюсь, это поможет - дайте мне знать, как вы ладите.

0 голосов
/ 28 февраля 2019

Перечень наивных слов

DICTIONARY = {
  "Hello" => "hi",
  "to, two, too" => "2",
  "for, four" => "4",
  "be" => "b",
  "you" => "u",
  "at" => "@",
  "and" => "&"
}.freeze

def word_substituter(tweet)
  dict = {}
  DICTIONARY.keys.map { |k| k.split(', ') }.flatten.each do |w|
    DICTIONARY.each { |k, v| dict.merge!(w => v) if k.include?(w) }
  end

  tweet.split(' ').map do |s|
    dict.each { |k, v| s.sub!(/#{k}/, v) if s =~ /\A#{k}[[:punct:]]*\z/ }
    s
  end.join(' ')
end

word_substituter("Hey guys, I'm Robe too. Can anyone teach me how to be cool? I really want to be the best at everything, you know what I mean? Tweeting is super fun you guys!!!!")

# => "Hey guys, I'm Robe 2. Can anyone teach me how 2 b cool? I really want 2 b the best @ everything, u know what I mean? Tweeting is super fun u guys!!!!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...