Регулярное выражение для обнаружения повторения внутри строки

Можно ли обнаруживать повторяющиеся шаблоны чисел с регулярным выражением?

Так, например, если бы у меня была следующая строка «034503450345», можно было бы сопоставить повторяющуюся последовательность 0345? У меня такое чувство, что это выходит за frameworks регулярного выражения, но я думал, что попрошу здесь все равно посмотреть, не пропустил ли я что-нибудь.

Да, вы можете – вот тестовый пример Python

import re print re.search(r"(\d+).*\1", "8034503450345").group(1) # Prints 0345 

Регулярное выражение говорит «найти некоторую последовательность цифр, затем любое количество другого материала, затем повторить ту же последовательность».

На одной лишь заметке, вот одно из моих любимых регулярных выражений – детектор простых чисел:

 import re for i in range(2, 100): if not re.search(r"^(xx+)\1+$", "x"*i): print i 

Это выражение будет соответствовать одной или нескольким повторяющимся группам:

 (.+)(?=\1+) 

Здесь одно и то же выражение разбито (используя комментирование, поэтому его можно использовать напрямую как регулярное выражение).

 (?x) # enable regex comment mode ( # start capturing group .+ # one or more of any character (excludes newlines by default) ) # end capturing group (?= # begin lookahead \1+ # match one or more of the first capturing group ) # end lookahead 

Чтобы сопоставить определенный шаблон, измените .+ этот шаблон, например \d+ для одного или нескольких чисел, или \d{4,} чтобы соответствовать 4 или более номерам.

Чтобы соответствовать определенному числу шаблона, измените \1+ , например, на \1{4} для четырех повторений.

Чтобы повторение не было рядом друг с другом, вы можете добавить .*? внутри взгляда.

Просто добавьте примечание к (правильному) ответу от RichieHindle:

Обратите внимание, что в то время как реализация регулярного выражения Python (и многие другие, такие как Perl) может это сделать, это уже не регулярное выражение в узком смысле слова.

Ваш пример не является обычным языком, поэтому не может обрабатываться чистое регулярное выражение. См., Например, отличную статью в Википедии .

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

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

Это код C #, который использует конструкцию backreference для поиска повторяющихся цифр. Он будет работать с 034503450345, 123034503450345, 034503450345345, 232034503450345423. Регулярное выражение намного проще и понятнее.

 ///  /// Assigns repeated digits to repeatedDigits, if the digitSequence matches the pattern ///  /// true if success, false otherwise public static bool TryGetRepeatedDigits(string digitSequence, out string repeatedDigits) { repeatedDigits = null; string pattern = @"^\d*(?\d+)\k+\d*$"; if (Regex.IsMatch(digitSequence, pattern)) { Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); repeatedDigits = r.Match(digitSequence).Result("${repeat}"); return true; } else return false; } 

Повторное повторение регулярных выражений: bar {2,} ищет текст с двумя или более барами: barbarbarbarbar …