Python re.findall () кроме переменной - PullRequest
1 голос
/ 13 марта 2019

Регулярные выражения не использовались очень часто, у меня есть редкий случай, который описан ниже. Я пытаюсь использовать re.findall () на выходе команды. [использовал pexcept для запуска команды на удаленном хосте]

root@test# cinder image-metadata-show 9a4d222b-a6f2-4ddc-a1ce-9a635335a4b4 | grep 'image_id' | cut -d '|' -f3 46519bdf-3ae9-44e2-acce-bd1ac76fd523

Я пытаюсь получить 46519bdf-3ae9-44e2-acce-bd1ac76fd523, используя re.findall (), но проблема в том, что re.findall совпадает даже в команде. Мой окончательный вывод выглядит примерно так:

re.findall("(\w+-\w+-\w+-\w+-\w+)", volume_show)
output:['9a4d222b-a6f2-4ddc-a1ce-9a635335a4b4', '46519bdf-3ae9-44e2-acce-bd1ac76fd523']

Я хочу экранировать 9a4d222b-a6f2-4ddc-a1ce-9a635335a4b4, который хранится в переменной в моем коде.

например:

vol_id = 9a4d222b-a6f2-4ddc-a1ce-9a635335a4b4
re.findall("(\w+-\w+-\w+-\w+-\w+)", volume_show) except vol_id
output = ['46519bdf-3ae9-44e2-acce-bd1ac76fd523']

Как я могу это сделать? Я натолкнулся на re.escape () и использовал 'негативный взгляд', не очень понятно, как использовать вместе re.escape и re.findall (). Любые предложения будут высоко оценены.

ТИА

Ответы [ 3 ]

1 голос
/ 13 марта 2019

Вы можете добавить символы в начало вашего регулярного выражения, чтобы они соответствовали началу и новой строке.Вот модификация вашего выражения, которая соответствует началу строки ^ или символу новой строки \n переменной длины пробела \s*, а затем вашим 4 группам буквенно-цифровых символов: [\^\n]\s*(\w+-\w+-\w+-\w+-\w+)

И вот как это выглядитв сеансе Python:

volume_show = '''root@test# cinder image-metadata-show 9a4d222b-a6f2-4ddc-a1ce-9a635335a4b4 | grep 'image_id' | cut -d '|' -f3\n 46519bdf-3ae9-44e2-acce-bd1ac76fd523\n\n'''

re.findall('[\^\n]\s*(\w+-\w+-\w+-\w+-\w+)', volume_show)                                                                                                                   

['46519bdf-3ae9-44e2-acce-bd1ac76fd523'] 
0 голосов
/ 13 марта 2019

Вы можете использовать отрицательный прогноз:

re.findall(r"(?!%s)(\w+-\w+-\w+-\w+-\w+)" % vol_id, volume_show)
0 голосов
/ 13 марта 2019

Не можете ли вы сделать некоторую постобработку?как

output = [x for x in output if x != vol_id]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...