Как исправить это регулярное выражение, чтобы оно возвращало только знаки препинания и слова, содержащие знаки препинания? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть регулярное выражение, которое возвращает слова с пунктуацией, пунктуацией и словами, которые не содержат пунктуацию.

class String

     def words_and_punctuation
        scan(/[\w'-]+|[[:punct:]]+/)
      end

     def punctuation?
       scan(/\s?[[:punct:]]/).present? 
     end
end

Я бы хотел улучшить, чтобы он возвращал только знаки препинания или слова, содержащие знаки препинания.

В настоящее время я использую это так:

text.words_and_punctuation.select(&:punctuation?)

string = "Мужская шляпа действительно очень хорошая."

string.words_and_punctuation

=> ["The", "man's", "hat", ",", "was", "very", "nice", "."]

string.words_and_punctuation.select(&:punctuation?)

=> ["man's", ",", "."]

Мне бы не хотелось использовать выбор и сопоставлять правильные элементы с помощью регулярного выражения.

Любая помощь приветствуется.

Ответы [ 4 ]

0 голосов
/ 04 мая 2018

Я понял, что мои требования были более сложными, чем в тот момент, когда я писал.

Мне нужно сопоставить частично дефисные слова (например, «-быстрый»), а также слова «просто и точно».

Итак, я нашел следующее регулярное выражение для работы.

regex = /\w*['-]\w*[-]*\w*[-]*\w*|[[:punct:]]+/

string = "The man, had a big-cat that his Sister's aunt gave him and was -fast 's very-very-big-cat.!!"

Предложение не имеет особого смысла, но включает в себя несколько хороших примеров слов с пунктуацией и пунктуацией, которым я должен соответствовать.

string.scan (регулярное выражение)

=> [",", "big-cat", "Sister's", "-fast", "'s", "very-very-big-cat", ".!!"]

Могут быть способы улучшить способ написания регулярных выражений, но лучшее, что я могу сделать, - это получить нужные мне результаты.

0 голосов
/ 03 мая 2018
"The man's hat is really, very nice.".
  scan /\w+[[:punct:]]\w+|[[:punct:]](?=\s|\z)/
#⇒ ["man's", ",", "."]

Вероятно, будет достаточно ваших потребностей. Это довольно неточно, поскольку соответствует опечаткам типа «foo! Bar», но этого должно быть достаточно для этой конкретной задачи.

0 голосов
/ 03 мая 2018

Как насчет этого?

 /[a-zA-z]+['-][a-z]+|[[:punct:]]/

Я попробовал это на нескольких предложениях:

2.4.1 :056 > r = Regexp.new /[a-zA-z]+['-][a-z]+|[[:punct:]]/
=> /[a-zA-z]+['-][mst]|[[:punct:]]/
2.4.1 :057 > "The man's hat was, very nice".scan(r)
=> ["man's", ","]
2.4.1 :058 > "The man's hat was, very nice.".scan(r)
=> ["man's", ",", "."]
2.4.1 :059 > "The man's hat was, very nice. who. . would have thougt so?".scan(r)
=> ["man's", ",", ".", ".", ".", "?"]

Как это работает, в стандартных английских словах встречается пара знаков препинания - дефисы и апострофы. Таким образом, первая часть регулярного выражения перед символом канала ищет эти слова, а вторая половина - все остальное.

0 голосов
/ 03 мая 2018

Общим требованием является наличие знаков препинания, поэтому сделайте это обязательным:

def words_and_punctuation
    scan(/(?:[[:punct:]]|[\w'-])*[[:punct:]]+(?:[[:punct:]]|[\w'-])*/)
end

В более типичном регулярном выражении мы могли бы написать этот шаблон как:

[&$#^@.A-Za-z0-9'-]*[&$#^@.]+[&$#^@.A-Za-z0-9'-]*

Другими словами, это просто говорит о соответствии одному или нескольким знакам препинания, необязательно окруженным символами слова или несколькими знаками препинания. Этот шаблон не будет соответствовать слову без знаков препинания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...