Python RegEx, который соответствует символу, сопровождаемому / предшествующему тому же символу, но прописному / строчному - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь построить регулярное выражение, которое найдет: aA, Aa, bB, cC , но не подойдет: aB, aa, AA, aC, Ca.

- если мы встречаем строчную букву, мы хотим проверить, является ли следующая / предыдущая буква заглавной;наше регулярное выражение

Я хочу, чтобы за любым символом следовал / предшествовал тот же самый символ, но заглавными буквами.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вы можете сделать это с модулем регулярных выражений 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) отфильтровывает нежелательные совпадения.

0 голосов
/ 05 декабря 2018

Это можно сделать с помощью re:

import re
import string

pattern = re.compile('|'.join([''.join(i) for i in zip(list(string.ascii_lowercase), list(string.ascii_uppercase))])
pattern.search(your_text)

Если вы ищете повторяющуюся букву, которая переключает регистр (либо с нижнего на верхний, либо с верхнего на нижний), тогда вы можете использовать:

pattern = '|'.join([''.join(i) for i in zip(list(string.ascii_uppercase), list(string.ascii_lowercase))] + [''.join(i) for i in zip(list(string.ascii_lowercase), list(string.ascii_uppercase))])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...