Регулярное выражение для букв, имеющих постоянное алфавитное расстояние между ними - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь сопоставить слова с буквами, которые имеют некоторое постоянное алфавитное расстояние между ними, например, я хотел бы найти все слова с A.*B, B.*C, C.*D и т. Д. Я в настоящее время используется пакет 're' в Python 3.

Есть ли способ сделать это без указания всех кортежей букв на расстоянии 1 друг от друга? То есть не (A.*B|B.*C|C.*D|....|Y.*Z).

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

1 Ответ

0 голосов
/ 09 ноября 2018

Порядковый номер «А» - 97, «В» - 98 и т. Д. Вы можете определить понимание списка, которое может сделать это для вас. Например

distance = 1
regex = '(' + '|'.join("{}.*{}".format(chr(x), chr(x+distance)) for x in range(ord('A'), ord('Z')+1-distance)) + ')'
print(regex)
>>> (A.*B|B.*C|C.*D|D.*E|E.*F|F.*G|G.*H|H.*I|I.*J|J.*K|K.*L|L.*M|M.*N|N.*O|O.*P|P.*Q|Q.*R|R.*S|S.*T|T.*U|U.*V|V.*W|W.*X|X.*Y|Y.*Z)
distance = 2
regex = '(' + '|'.join("{}.*{}".format(chr(x), chr(x+distance)) for x in range(ord('A'), ord('Z')+1-distance)) + ')'
print(regex)
>>> (A.*C|B.*D|C.*E|D.*F|E.*G|F.*H|G.*I|H.*J|I.*K|J.*L|K.*M|L.*N|M.*O|N.*P|O.*Q|P.*R|Q.*S|R.*T|S.*U|T.*V|U.*W|V.*X|W.*Y|X.*Z)
...