Повторный шаблон в регулярном выражении Python - PullRequest
1 голос
/ 28 октября 2019

Новичок в регулярных выражениях Python и хотел бы написать что-то, что соответствует этому

<name>.name.<age>.age@<place>

Я могу сделать это, но хотел бы, чтобы шаблон имел и проверял имя и возраст.

pat = re.compile("""
       ^(?P<name>.*)
        \.
        (?P<name>.*)
        \.
        (?P<age>.*)
        \.
        (?P<age>.*?)
        \@
        (?P<place>.*?)
        $""", re.X)

Затем я сопоставляю и извлекаю значения. res = pat.match('alan.name.65.age@jamaica')

Хотите узнать лучшую практику для этого?

Ответы [ 3 ]

3 голосов
/ 28 октября 2019

Совпадение .name и .age буквально. Для этого вам не нужны новые группы.

pat = re.compile("""
       ^(?P<name>[^.]*)\.name
        \.
        (?P<age>[^.]*)\.age
        \@
        (?P<place>.*)
        $""", re.X)

Примечания

  • Я заменил .* ("что-нибудь") на [^.]* ("все, крометочка "), потому что точка не может быть частью имени в отображаемом вами шаблоне.
  • Подумайте, имеете ли вы в виду * (0-неограниченных вхождений) или, скорее, + (1-неограниченных вхождений).
2 голосов
/ 28 октября 2019

Нет причин не разрешать . в именах, например John Q. Public.

import re

pat = re.compile(r"""(?P<name>.*?)\.name
                 \.(?P<age>\d+)\.age
                 @(?P<place>.*$)""",
                 flags=re.X)
m = pat.match('alan.name.65.age@jamaica')
print(m.group('name'))
print(m.group('age'))
print(m.group('place'))

Отпечатки:

alan
65
jamaica
0 голосов
/ 28 октября 2019

Группы вам не нужны, если вы используете re.split:

re.split('\.name\.|\.age', "alan.name.65.age@jamaica")

Это вернет имя и возраст в качестве первых двух элементов списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...