Я должен соответствовать выражению в Python с регулярными выражениями, который только соответствует четному числу случаев буквы. Например:
AAA # no match AA # match fsfaAAasdf # match sAfA # match sdAAewAsA # match AeAiA # no match
Четное число того, Как ДОЛЖЕН соответствовать.
Попробуйте это регулярное выражение:
^[^A]*((AA)+[^A]*)*$
и если A
не нужно быть последовательным:
^[^A]*(A[^A]*A[^A]*)*$
Это ищет блок с нечетным числом А. Если вы нашли одну, строка плохая для вас:
(?<!A)A(AA)*(?!A)
Если я правильно понимаю, код Python должен выглядеть так:
if re.search("(?<!A)A(AA)*(?!A)", "AeAAi"):
print "fail"
Прежде всего, обратите внимание, что / A * /
соответствует пустой строке.
Во-вторых, есть некоторые вещи, которые вы просто не можете сделать с регулярными выражениями. Это будет намного проще, если вы просто проходите через строку и подсчитаете все происшествия в письме, которое вы ищете.
'*' означает 0 или более наказаний «АА» должен сделать трюк.
Вопрос в том, если вы хотите, чтобы вещь соответствовала «AAA». В этом случае вам пришлось бы сделать что-то вроде:
r = re.compile('(^|[^A])(AA)+(?!A)',)
r.search(p)
, которое будет работать на матче даже (и только даже) числа'а.
Теперь, если вы хотите подобрать «Если есть какое-либо даже количество последующих писем», это будет делать трюк:
re.compile(r'(.)\1')
Однако это не исключает бы «странные» происшествия. Но из вашего вопроса не ясно, если вы действительно этого хотите.
Обновление: Это работает для вас, тестируемые случаи:
re.compile('^([^A]*)AA([^A]|AA)*$')
'A *'
означает соответствие любому числу A
'. Даже 0.
Вот как сопоставить последовательность с четным числом a ', верхнего или нижнего:
re.compile(r'''
^
[^a]*
(
(
a[^a]*
){2}
# if there must be at least 2 (not just 0), change the
# '*' on the following line to '+'
)*
$
''',re.IGNORECASE|re.VERBOSE)
В качестве примера можно использовать a
. Если требуется сопоставить определенный символ, отличный от a
, замените a
на % s
, а затем вставьте
[...]
$
'''%( other_char, other_char, other_char )
[...]
-121--3085415- Обратите внимание, что /A */
соответствует пустому ряду.
Во-вторых, есть некоторые вещи, которые вы просто не можете сделать с регулярными выражениями. Это будет намного проще, если вы просто пройдетесь по последовательности и подсчитаете все вхождения письма, которое вы ищете.
-121--3085417-A * означает соответствие «A» 0 или более раз.
Для четного числа «A» попробуйте: (AA) +
* '
означает соответствие любому количеству A
. Даже 0.
Вот как сопоставить строку с четным количеством a, верхнего или нижнего:
re.compile(r'''
^
[^a]*
(
(
a[^a]*
){2}
# if there must be at least 2 (not just 0), change the
# '*' on the following line to '+'
)*
$
''',re.IGNORECASE|re.VERBOSE)
Вы, вероятно, используете A
в качестве примера. Если вы хотите сопоставить определенный персонаж, отличный от A
, заменить A
с % s
, а затем вставьте
[...]
$
'''%( other_char, other_char, other_char )
[...]
Почему так усердно придумывать с трудом для чтения? Просто ищите все вхождения шаблона и подсчитайте, сколько вы найдете.
len(re.findall("A", "AbcAbcAbcA")) % 2 == 0
Это должно быть мгновенно понятно всеми опытными программистами, тогда как узор, как «(?
Просто лучше.
Это невозможно , чтобы сосчитать произвольно , используя регулярные выражения. Например, убедитесь, что у вас есть соответствие скобками. Чтобы подсчитать вам нужную «память», которая требует что-то, по крайней мере, сильное как автомат отключения , хотя в этом случае вы можете использовать регулярное выражение, которое предоставлено @gumbo.
Предложение для использования Faceiter
- лучший обходной путь для общего случая.