Вы можете сделать это с модулем регулярных выражений PyPi (обратите внимание, что он будет работать с Java, PCRE (PHP, R, Delphi), Perl, .NET, но не будет работать с ECMAScript (JavaScript, C ++)std::regex
), RE2 (Go, Google Apps Script)) с использованием
(\p{L})(?!\1)(?i:\1)
См. regex demo и доказательство того, что оно работает в Python :
import regex
rx = r'(\p{L})(?!\1)(?i:\1)'
print([x.group() for x in regex.finditer(rx, ' aA, Aa, bB, cC but not aB, aa, AA, aC, Ca')])
# => ['aA', 'Aa', 'bB', 'cC']
Решение основано на встроенной группе модификаторов (?i:...)
, внутри которой все символы обрабатываются без учета регистра, в то время как другие части чувствительны к регистру (при условии, что других (?i)
или re.I
нет).
Подробности
(\p{L})
- любая буква, занесенная в группу 1 (?!\1)
- отрицательный прогноз, который не соответствует совпадениюесли следующий символ абсолютно идентичен тому, который был захвачен в группе 1, обратите внимание, что индекс регулярного выражения по-прежнему находится сразу после символа, захваченного с помощью (\p{L})
(?i:\1)
- группа модификаторов без учета регистра, которая содержит обратную ссылкук значению группы 1, но так как оно совпадает с ней без учета регистра, ономожет совпадать с a
и A
- НО предыдущий запрос исключает вариант с альтернативным регистром (поскольку предыдущий \1
сопоставляется с учетом регистра).
Чтоо re
решении?
В re
нельзя сделать часть шаблона необязательной, так как (?i)
в любой части шаблона делает его нечувствительным к регистру.Кроме того, re
не поддерживает группы модификаторов.
Вы можете использовать что-то вроде
import re
rx = r'(?i)([^\W\d_])(\1)'
print([x.group() for x in re.finditer(rx, ' aA, Aa, bB, cC but not aB, aa, AA, aC, Ca') if x.group(1) != x.group(2)])
См. Демонстрационную версию Python .
(?i)
- установить полное регулярное выражение без учета регистра ([^\W\d_])
- письмо захватывается в группу 1 (\1)
- то же письмо вводится в группу 2 (без учета регистра,поэтому Aa
, aA
, aa
и AA
будут совпадать).
Условие if x.group(1) != x.group(2)
отфильтровывает нежелательные совпадения.