首页 > 解决方案 > Python re.findall() 除了一个变量

问题描述

没有经常使用正则表达式,我有一个罕见的情况,如下所述。我正在尝试在命令输出上使用 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

我正在尝试使用 re.findall() 获取 46519bdf-3ae9-44e2-acce-bd1ac76fd523 但问题是 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()。任何建议将不胜感激。

TIA

标签: pythonregex

解决方案


您可以在正则表达式的开头添加字符以匹配行首和换行符。

这是您的表达式的修改,它匹配行开头^或换行符\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'] 

推荐阅读