Nano Hash - криптовалюты, майнинг, программирование

Повторяющиеся буквы группы регулярных выражений

Я пытаюсь сгруппировать все повторяющиеся буквы в строку.

Eg:

"aaaaaaabbbbbbbbc" => [['aaaaaaa'],['bbbbbbbb'],['c']]

Используя логику и Ruby, я нашел единственный способ достичь своей цели:

.scan(/(?:a+|A+)|(?:b+|B+)|(?:c+|C+)| ..... (?:y+|Y+)|(?:z+|Z+))

где ... — остальные буквы алфавита.

Есть ли способ высушить это регулярное выражение? Я также использовал обратную трассировку (\1), но она не соответствует отдельным словам и не возвращает точное совпадение букв => (\w+)\1 => [['aa'],['bb']]

Хм, я ошибаюсь, используя регулярные выражения для этого случая, и я должен использовать методы Ruby с итерациями?

Буду рад услышать ваше мнение :) Спасибо!

28.10.2017

  • Вы действительно хотите [['aaaaaaa'], ['bbbbbbbb'], ['c']], а не только ['aaaaaaa', 'bbbbbbbb', 'c']? 28.10.2017
  • Ответы отражают некоторую путаницу в вашем вопросе. Вы хотите, чтобы возвращаемое значение для "abab" было ["a", "b", "a", "b"] или ["aa", "bb"]? 28.10.2017
  • Если вы не знали, вы можете проголосовать за выбранный вами ответ. 29.10.2017

Ответы:


1

Просто используйте другую группу захвата, чтобы поймать повторяющиеся символы.

s.scan(/((\w)\2*)/).map(&:first)
# => ["aaaaaaa", "bbbbbbbb", "c"]
28.10.2017
  • Интересный! Вместо этого вы могли бы написать map(&:first). Как String#scan работает с группами это как тот обоюдоострый меч, который вы держите в руках: он либо удобен, либо, как здесь, раздражает. 29.10.2017
  • @Cary Как всегда спасибо :-) 29.10.2017
  • Мне нравится это решение, но я также хочу его понять. Может ли кто-нибудь объяснить, как настроено регулярное выражение, особенно '\2*'? Спасибо! 11.12.2018
  • @Krisztina в регулярном выражении мы используем \<group_number> для обозначения соответствующих захваченных символов, скажем, \1 относится к символам, которые захватываются первой группой захвата (), тогда как \2 относится ко второй группе захвата. Так же продолжается. Итак, здесь (\w) должен захватить все символы слова, а (\w)\1* соответствует всем символам слова, а также следующим 0 или более повторяющимся символам. скажем, он соответствует b, nn, b во входной строке bnnb. Поскольку функция scan возвращает только захваченные символы, я снова помещаю все регулярное выражение в другую группу. 11.12.2018
  • Но если мы используем \1, это все еще относится к первой группе, но нам нужна вторая, поэтому я использовал \2 11.12.2018

  • 2

    Еще одно решение без регулярного выражения :)

    "aaaaaaabbbbbbbbc".chars.group_by(&:itself).values.map { |e| [e.join] }
     #=> [["aaaaaaa"], ["bbbbbbbb"], ["c"]]
    
    28.10.2017

    3

    Вот несколько других способов сделать это. Все возвращаются ["aaaaaaa", "bbbbbbbb", "c"]. Если [["aaaaaaa"], ["bbbbbbbb"], ["c"]] действительно требуется (я не могу представить, почему), это простой дополнительный шаг с использованием map.

    s.each_char.chunk(&:itself).map(&:join)
    
    s.each_char.chunk_while { |a,b| b == a }.map(&:join)
    
    s[1..-1].each_char.with_object([s[0]]) {|c,a| c == a.last[0] ? (a.last<<c) : a<< c}
    
    s.gsub(/(.)\1*/).with_object([]) { |t,a| a << t }
    

    В последнем из них String#gsub не имеет блока, поэтому он возвращает перечислитель (и не выполняет замену символов). Такое использование gsub может быть использовано с пользой во многих ситуациях.

    28.10.2017

    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..