#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()