Regex соответствуют четному количеству букв

Я должен соответствовать выражению в Python с регулярными выражениями, который только соответствует четному числу случаев буквы. Например:

AAA        # no match
AA         # match
fsfaAAasdf # match
sAfA       # match
sdAAewAsA  # match
AeAiA      # no match

Четное число того, Как ДОЛЖЕН соответствовать.

10
задан random 23 January 2016 в 05:26
поделиться

8 ответов

Попробуйте это регулярное выражение:

^[^A]*((AA)+[^A]*)*$

и если A не нужно быть последовательным:

^[^A]*(A[^A]*A[^A]*)*$
17
ответ дан 3 December 2019 в 17:20
поделиться

Это ищет блок с нечетным числом А. Если вы нашли одну, строка плохая для вас:

(?<!A)A(AA)*(?!A)

Если я правильно понимаю, код Python должен выглядеть так:

if re.search("(?<!A)A(AA)*(?!A)", "AeAAi"):
   print "fail"
3
ответ дан 3 December 2019 в 17:20
поделиться

Прежде всего, обратите внимание, что / A * / соответствует пустой строке.

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

0
ответ дан 3 December 2019 в 17:20
поделиться

'*' означает 0 или более наказаний «АА» должен сделать трюк.

Вопрос в том, если вы хотите, чтобы вещь соответствовала «AAA». В этом случае вам пришлось бы сделать что-то вроде:

r = re.compile('(^|[^A])(AA)+(?!A)',)
r.search(p)

, которое будет работать на матче даже (и только даже) числа'а.

Теперь, если вы хотите подобрать «Если есть какое-либо даже количество последующих писем», это будет делать трюк:

re.compile(r'(.)\1')

Однако это не исключает бы «странные» происшествия. Но из вашего вопроса не ясно, если вы действительно этого хотите.

Обновление: Это работает для вас, тестируемые случаи:

re.compile('^([^A]*)AA([^A]|AA)*$')
1
ответ дан 3 December 2019 в 17:20
поделиться

'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) +

0
ответ дан 3 December 2019 в 17:20
поделиться

* ' означает соответствие любому количеству 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 )
[...]
2
ответ дан 3 December 2019 в 17:20
поделиться

Почему так усердно придумывать с трудом для чтения? Просто ищите все вхождения шаблона и подсчитайте, сколько вы найдете.

len(re.findall("A", "AbcAbcAbcA")) % 2 == 0

Это должно быть мгновенно понятно всеми опытными программистами, тогда как узор, как «(?

Просто лучше.

0
ответ дан 3 December 2019 в 17:20
поделиться

Это невозможно , чтобы сосчитать произвольно , используя регулярные выражения. Например, убедитесь, что у вас есть соответствие скобками. Чтобы подсчитать вам нужную «память», которая требует что-то, по крайней мере, сильное как автомат отключения , хотя в этом случае вы можете использовать регулярное выражение, которое предоставлено @gumbo.

Предложение для использования Faceiter - лучший обходной путь для общего случая.

0
ответ дан 3 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: