Можно ли сопоставить повторение символа с регулярным выражением? Как? - PullRequest
11 голосов
/ 21 июня 2009

Вопрос:
Можно ли с помощью регулярного выражения сопоставить слово, содержащее один и тот же символ в разных позициях?

Состояние:
Все слова имеют одинаковую длину, вы знаете положение символов (например, 1-е, 2-е и 4-е) повторяющегося символа, но вы не знаете, что это такое.

Примеры:
используя строчные 6-символьные слова, я бы хотел сопоставить слова, в которых 3-й и 4-й символы совпадают.

parrot <- match for double r
follia <- match for double l 
carrot <- match for double r
mattia <- match for double t
rettoo <- match for double t
melone <- doesn't match

Я не могу использовать квантификатор [\ d] {2}, потому что он соответствует любой последовательности двух символов, и что если я скажу 2-ю и 4-ю позиции вместо 3-й и 4-й?

Можно ли делать то, что я хочу, с помощью регулярных выражений? Если да, как я могу это сделать?

РЕДАКТИРОВАТЬ:
Спросите спросили в комментариях, я использую python

Ответы [ 4 ]

34 голосов
/ 21 июня 2009

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

(.)\1

Это будет соответствовать последовательным вхождениям любого символа.


Редактировать Вот пример Python:

import re

regexp = re.compile(r"(.)\1")
data = ["parrot","follia","carrot","mattia","rettoo","melone"]

for str in data:
    match = re.search(regexp, str)
    if match:
        print str, "<- match for double", match.group(1)
    else:
        print str, "<- doesn't match"
8 голосов
/ 21 июня 2009

Вам необходимо использовать обратные ссылки для таких случаев. Я не уверен, какой язык вы используете, я попробовал следующий пример в моем редакторе VI, чтобы найти любой повторяющийся алфавит. Шаблон регулярного выражения: \([a-z]\)\1

Если вы видите пример, [a-z] - это шаблон, который вы ищете, и заключите его в парантез (парантезы следует избегать на некоторых языках) После того, как у вас есть парантез, это группа, и вы можете снова обратиться в любое место в регулярном выражении с помощью \ 1. Если существует более одной группы, вы можете использовать \ 1, \ 2 и т. Д. \ 1 будет заменено на то, что было найдено в первой группе.

Спасибо Arvind

2 голосов
/ 21 июня 2009

/(\b\w*?(\w)\2.*?\b)/

будет соответствовать любому слову с минимальным повторением символов $ 1 - это слово 2 доллара за первое повторение.

0 голосов
/ 21 июня 2009

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

Регулярное выражение (?<char>\w)\k<char>, используя именованные группы и обратные ссылки, ищет соседние парные символы. Применительно к строке «У меня будет маленький кофе» он находит совпадения в словах «я», «маленький» и «кофе». Метасимвол \w находит любой символ из одного слова. Конструкция группировки (?<char>) заключает метасимвол, чтобы заставить механизм регулярных выражений запоминать совпадение подвыражения (которое в данном случае будет одним символом) и сохранять его под именем «char» Конструкция обратной ссылки \k<char> заставляет движок сравнивать текущий символ с ранее сопоставленным символом, хранящимся в «char». Все регулярное выражение успешно находит совпадение, где один символ совпадает с предыдущим символом.

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