Я был отвечая на этот вопрос n.Рассмотрим эту строку
str1 = '{"show permission allowed to 16": "show permission to 16\\nSchool permissions from group 17:student to group 16:teacher:\\n\\tAllow ALL-00\\nSchool permissions from group 18:library to group 16(Temp):teacher:\\n\\tNo Allow ALL-00\\nSchool permissions from group 20:Gym to group 16:teacher:\\n\\tCheck ALL-00\\nRTYAHY: FALSE\\nRTYAHY: FALSE\\n\\n#"}'
и предположим, что я хочу извлечь число после каждой подстроки from group
и подстроки после \\t
с наименьшей соответствующей строкой.
Я сделал это сследующее регулярное выражение
import re
res = re.findall(r'from group (\d+).*?\\t(.*? ALL-..)', str1)
вывод:
[('17', 'Allow ALL-00'), ('18', 'No Allow ALL-00'), ('20', 'Check ALL-00')]
Теперь между каждой извлекаемой подстрокой (число и подстрока после \t
) может быть необязательная подстрока, чьязначение Temp
Я хочу извлечь (если есть).Например, между 18
и No Allow ALL-00
есть подстрока Temp
, которую я хотел бы извлечь.
Я попытался использовать ?
следующим образом:
res = re.findall(r'from group (\d+).*?(Temp)?.*?\\t(.*? ALL-..)', str1)
, но соответствующийВторой элемент результирующих кортежей всегда пуст:
[('17', '', 'Allow ALL-00'), ('18', '', 'No Allow ALL-00'), ('20', '', 'Check ALL-00')]
, пока я ожидал что-то вроде:
[('17', '', 'Allow ALL-00'), ('18', 'Temp', 'No Allow ALL-00'), ('20', '', 'Check ALL-00')]
Как извлечь подстроки в этом случае?В чем заключается ошибка, которую я делаю?
Еще один вопрос: предположим, я хочу, чтобы в моем результирующем списке не было этого элемента (содержащего Temp
): нужно ли просто использовать [^]
и затем соответствующий шаблон сопоставления