Регулярное выражение Python для сопоставления нескольких шаблонов в заданной строке - PullRequest
2 голосов
/ 22 мая 2019

В приведенной ниже строке мне нужны значения Version: Build Number: и perforce_url:. В настоящее время я получаю каждое из совпадений, перечисленных выше, отдельно.Я хотел бы упростить мой код, чтобы получить совпадение в одной строке.

x = '''Version: 2.2.4125
Build Number: 125
Project Name: xyz.master
Git Url: git+ssh://git@stash.xyz.com:123/ab/dashboard
Git Branch: origin/master
Git Built Data: qw123ed45rfgt689090gjlllb
perforce_url:
  //projects/f5/dashboard/1.3/xyz/portal/
artifacts:
   "..//www/":     www/ '''

Я использовал re.match для извлечения значения Version: Build Number: и Perforce_url: отдельно.Тем не менее, я хотел бы упростить и сделать это в одну строку.

import re
matchObj=re.match('Version:\s*(.*)\n', x)
if matchObj:
  print  matchObj.group(1)

matchObj=re.match('perforce_url:\s*(.*)\n', x)
if matchObj:
  print  matchObj.group(1)
matchObj=re.match('Build Number:\s*(.*)\n', x)
if matchObj:
  print  matchObj.group(1)

Я попробовал следующий шаблон:

Версия: \s*(.*)\n|perforce_url:\s*(.*)\n.

Но это не сработало.Я хочу создать список x и добавить совпадения в список, используя

list = []
list.append()

Ожидаемый результат:

['2.2.4125', '// projects / f5 / dashboard/1.3/xyz/portal/ ',' 125 ']

Фактический результат

2.2.4125

// projects / f5 / dashboard /1.3 / xyz / portal /

125

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Вы можете поместить Version и Build Number друг за другом, чтобы получить эти значения в группе захвата.

Для preforce_url вы можете использовать повторяющийся шаблон, используя отрицательный прогноз (?:\n(?!perforce).*)*, чтобы соответствовать строкам, если они не начинаются с perforce_url.

Когда есть, сопоставьте это с помощью группы захвата:

Version:\s*(.*)\nBuild Number:\s*(.*)(?:\n(?!perforce).*)*\nperforce_url:\s*(.*)

Regex demo | Python demo

Например:

import re

regex = r"Version:\s*(.*)\nBuild Number:\s*(.*)(?:\n(?!perforce).*)*\nperforce_url:\s*(.*)"
x = ("Version: 2.2.4125\n"
            "Build Number: 125\n"
            "Project Name: xyz.master\n"
            "Git Url: git+ssh://git@stash.xyz.com:123/ab/dashboard\n"
            "Git Branch: origin/master\n"
            "Git Built Data: qw123ed45rfgt689090gjlllb\n"
            "perforce_url:\n"
            "  //projects/f5/dashboard/1.3/xyz/portal/\n"
            "artifacts:\n"
            "   \"..//www/\":     www/ ")

print(re.findall(regex, x))

Результат

[('2.2.4125', '125', '//projects/f5/dashboard/1.3/xyz/portal/')]
1 голос
/ 22 мая 2019

На основании @ Четвертого ответа птицы, но с небольшим поворотом. Используя группы без захвата, вы можете избежать необходимости иметь группу без захвата между «номером сборки» и «исполнением». Таким образом, у вас есть регулярное выражение только для того, что вы явно хотите нацелить.

r"Version:\s*(.*)\n|Build Number:\s*(.*)\n|perforce_url:\s*(.*)\n"

regex

Редактировать: реализованные группы без захвата вокруг "Version", "Build" и т. Д. Были ненужными

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