регулярное выражение именованной группы, если существует - PullRequest
0 голосов
/ 04 октября 2018

Доброе утро,

У меня есть строка, которую мне нужно проанализировать и распечатать содержимое двух именованных групп, зная, что одна может не существовать.

Строка выглядит так (в основном содержимоеof / proc / pid / cmdline):

"""
<some chars with letters / numbers / space / punctuation> /CLASS_NAME:myapp.server.starter.StarterHome /PARAM_XX:value_XX /PARAM_XX:value_XX /CONFIG_FILE:myapp.server.config.myconfig.txt /PARAM_XX:value_XX /PARAM_XX:value_XX /PARAM_XX:value_XX <some chars with letters / numbers / space / punctuation>
"""

мои процессы имеют почти одинаковую структуру, то есть:

/CLASS_NAME:myapp.server.starter.StarterHome всегда присутствует, но /CONFIG_FILE:myapp.server.config.myconfig.txt НЕ всегда присутствует.

Я использую python2 с модулем re для перехвата значений.Пока мой шаблон выглядит следующим образом, и я могу поймать нужное значение, соответствующее /CLASS_NAME

re.compile('CLASS_NAME:\w+\W\w+\W\w+\W(?P<class>\w+)')

. Поскольку /CONFIG_FILE присутствует или нет, я добавил следующее к myregexp:

re.compile(r"""CLASS_NAME:\w+\W\w+\W\w+\W(?P<class>\w+).*?
               (CONFIG_FILE:\w+\W\w+\W\w+\W(?P<cnf>\w+.txt))?
            """, re.X)

Насколько я понимаю, вторая часть моего rexexp является необязательной, поскольку вся часть находится в скобках, за которыми следует ?.

К сожалению, мое предположение неверно, так какне смог поймать

Я также попытался удалить 1-й ?, но это не помогло.

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

Может ли кто-нибудь предложить решение по моему делу?

1 Ответ

0 голосов
/ 04 октября 2018

Вы можете обернуть всю необязательную деталь в необязательную группу без захвата и сделать обязательной группу захвата для CONFIG_FILE:

re.compile(r"""CLASS_NAME:(?:\w+\W+){3}(?P<class>\w+)(?:.*?
               (CONFIG_FILE:(?:\w+\W+){3}(?P<cnf>\w+\.txt)))?
        """, re.X)

В случае появления новых строк используйте опции модификатора re.X | re.S.Обратите внимание, что \w+\W\w+\W\w+\W лучше записать как (?:\w+\W+){3}.

См. Демонстрационную версию regex

Основное отличие - (?:.*?(CONFIG_FILE:(?:\w+\W+){3}(?P<cnf>\w+\.txt)))? part:

  • (?: - начало необязательного (так как после него указывается жадный ? квантификатор) сопоставления группы без захвата
    • .*? - любые 0+ символов, как можно меньше
    • (CONFIG_FILE:(?:\w+\W+){3}(?P<cnf>\w+\.txt)) - соответствует
      • CONFIG_FILE: - литеральная подстрока
      • (?:\w+\W+){3} - три последовательности из 1+ слов с последующими 1+ несловесными символами
      • (?P<cnf>\w+\.txt) - группа cnf: 1 + слово, точка (точка должна быть экранирована), а затем txt
  • )? - конец необязательной группы без захвата (которая будет пробоваться один раз)
...