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

У меня есть целая большая ... программа ... которая делает именно это. Вы можете вырвать сценарий и использовать его на свое усмотрение. Он выполняет все виды замен и находится по адресу http://bitbucket.org/nesteruk/typografix

.

8
задан Chas. Owens 3 June 2009 в 15:48
поделиться

4 ответа

Да, вы можете - вот тестовый пример 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
9
ответ дан 5 December 2019 в 04:55
поделиться

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

(.+)(?=\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} для четырех повторений.

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

19
ответ дан 5 December 2019 в 04:55
поделиться

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

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

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

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

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

8
ответ дан 5 December 2019 в 04:55
поделиться

Это код 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;
}
2
ответ дан 5 December 2019 в 04:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: