Как найти шаблон регулярного выражения с _ (подчеркивание), алфавиты с любым количеством символов и оканчивающиеся на = (равно) и числом? - PullRequest
0 голосов
/ 26 января 2020

Мне нужен шаблон регулярного выражения python, который совпадает с необязательным именем и знаком равенства, за которым следует целое число в функции. Python имена начинаются с алфавита c или символа подчеркивания и продолжаются (алфавит c, цифры c или подчеркивание). Целые числа имеют необязательный знак, за которым следуют несколько ненулевых чисел. Это не допускает пробелов в тексте.

Совпадения имеют имя и значение в словаре.

m = re.match(the-pattern,'x=3’) m.groupdict()

вернется

{'name': 'x', 'value': '3'}.

Некоторые тестовые случаи

re.match(p4a,'_a_b_c_12_=12').groupdict() -> {'name': '_a_b_c_12_', 'value': '12'}

re.match(p4a,'x=-12345').groupdict() -> {'name': 'x', 'value': '-12345'}

import re

#pattern = r"([_]+$?[A-Za-z0-9_]+$[=][0-9])"
pattern = r"(([A-Za-z]|_)|[0-9]|[=]\d+$)"
if re.match(pattern, "LS8"):
    print("Match 1")

if re.match(pattern, "_a_b_c_12_=12"):
    text = "_a_b_c_12_=12"
    items = text.split('=')
    d = {'name': items[0], 'value': items[-1]}

    print("Match 2 ", d)

if re.match(pattern, "1ab"):
    print("Match 3")

Я получаю вывод как

, но я хочу вывод как Совпадение 2 {'name': '_a_b_c_12_', 'value': '12'}

Ответы [ 3 ]

1 голос
/ 26 января 2020

Вы можете использовать это регулярное выражение с именованными группами для захвата name и value частей входной строки, как вы указали в вопросе:

(?:(?P<name>[_a-z][a-z0-9_]*)=)?(?P<value>[+-]?\d+)$

Вы можете передать каждый из ваши строки в re.match, чтобы проверить их по шаблону, распечатать номер элемента и словарь группы совпадений, когда совпадение найдено:

import re

pattern = r'(?:(?P<name>[_a-z][a-z0-9_]*)=)?(?P<value>[+-]?\d+)$'

for i, e in enumerate(['LS8', '_A_b_c_12_=12', 'lab', '-123', '4ab=5', 'a=3x']):
    m = re.match(pattern, e, re.I)
    if m:
        print('Match ' + str(i+1) + ' ', m.groupdict())

Вывод:

Match 2  {'value': '12', 'name': '_a_b_c_12_'}
Match 4  {'value': '-123', 'name': None}
1 голос
/ 26 января 2020

Для данных тестовых случаев должен работать следующий код:

import re

pattern = r"(?:(?P<name>[A-Za-z_][A-Za-z0-9_]*)=)?(?P<value>-?\d+)$"

match1 = re.match(pattern, "LS8")
if match1:
    print("Match 1 ", match1.groupdict())

match2 = re.match(pattern, "_a_b_c_12_=12")
if match2:
    print("Match 2 ", match2.groupdict())

match3 = re.match(pattern, "1ab")
if match3:
    print("Match 3 ", match3.groupdict())

match4 = re.match(pattern, "123")
if match4:
    print("Match 4 ", match4.groupdict())

Вывод:

Match 2  {'name': '_a_b_c_12_', 'value': '12'}
Match 4  {'name': None, 'value': '123'}
0 голосов
/ 26 января 2020

Регулярное выражение, которое вы ищете: ^([A-Za-z_][A-Za-z_0-9]*)=([-+]?\d+)$.

  • ^ и $ гарантирует, что найденная строка начинается в начале строки и заканчивается в конце строки. line.
  • [A-Za-z_] получает первый символ идентификатора python - должен быть буквой (в любом случае) или подчеркиванием
  • [A-Za-z_0-9]* получает следующие символы (если есть) , как указывает *) идентификатора, который может совпадать с первым символом плюс любые цифры
  • = - Один знак равенства
  • [+-]?\d+ получает конец строка - необязательный знак, за которым следует любое количество цифр
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...