У меня есть целая большая ... программа ... которая делает именно это. Вы можете вырвать сценарий и использовать его на свое усмотрение. Он выполняет все виды замен и находится по адресу http://bitbucket.org/nesteruk/typografix
.
Да, вы можете - вот тестовый пример 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 #, который использует конструкцию обратной ссылки для поиска повторяющихся цифр. Он будет работать с 034503450345, 123034503450345, 034503450345345, 232034503450345423. Регулярное выражение намного проще и понятнее для понимания.
/// <summary>
/// Assigns repeated digits to repeatedDigits, if the digitSequence matches the pattern
/// </summary>
/// <returns>true if success, false otherwise</returns>
public static bool TryGetRepeatedDigits(string digitSequence, out string repeatedDigits)
{
repeatedDigits = null;
string pattern = @"^\d*(?<repeat>\d+)\k<repeat>+\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;
}