Использование регулярного выражения для получения всех пользователей после «Users:»

#python #regex

#python #регулярное выражение

Вопрос:

У меня есть текстовый файл в этом формате.

 Users:
      user1
      user2
Groups:
      group1
      group2
 

Я пытаюсь получить пользователей (user1 и user2) из этого списка, используя этот шаблон:

 userRegex = 'Users:n(s S n)*'
users = re.search(userRegex, groupInfo)
 

Но список пуст, чего мне здесь не хватает?

Комментарии:

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

Ответ №1:

Используйте

 import re
groupInfo = """Users:
      user1
      user2
Groups:
      group1
      group2"""

match = re.search(r'Users:s*(.*?)(?=nGroups:)', groupInfo, re.S)
if match:
    print(match.group(1).split())
 

Смотрите Доказательство.

Результат: ['user1', 'user2'] .

Объяснение регулярных выражений

 --------------------------------------------------------------------------------
  Users:                   'Users:'
--------------------------------------------------------------------------------
  s*                      whitespace (n, r, t, f, and " ") (0 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  (                        group and capture to 1:
--------------------------------------------------------------------------------
    .*?                      any character except n (0 or more times
                             (matching the least amount possible))
--------------------------------------------------------------------------------
  )                        end of 1
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    n                       'n' (newline)
--------------------------------------------------------------------------------
    Groups:                  'Groups:'
--------------------------------------------------------------------------------
  )                        end of look-ahead
 

Комментарии:

1. Я бы изменил регулярное выражение на r'Users:s*(.*?)(?=nS |$)' в случае, если группы и пользовательские разделы находятся в разных порядках.

2. Я попробовал ваше решение, но оно не работает? Сейчас я тоже изучаю регулярные выражения. regex101.com/r/rlw1Ml/1

3. @KamranPervaiz Вы не включили re.S или re.DOTALL , это правильно — regex101.com/r/rlw1Ml/2

Ответ №2:

Я предполагаю, что это спецификация группы Perforce — если вы используете P4Python, при извлечении группы она автоматически преобразует спецификацию в объект Python, поэтому нет необходимости в манипуляциях с регулярными выражениями.

 from P4 import P4

p4 = P4()

p4.connect()
group = p4.fetch_group("mygroup")
users = group['Users']
subgroups = group['Groups']
p4.disconnect()