1
votes

Python re.findall () sauf une variable

Je n'ai pas utilisé d'expressions régulières très souvent, j'ai un cas rare qui est décrit ci-dessous. J'essaye d'utiliser re.findall () sur une sortie de commande. [utilisé pexcepté pour exécuter la commande sur l'hôte distant]

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

J'essaie d'obtenir 46519bdf-3ae9-44e2-acce-bd1ac76fd523 en utilisant re.findall () mais le problème est que re.findall correspond même dans la commande. Ma sortie finale est quelque chose comme ci-dessous

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']

Je veux échapper à 9a4d222b-a6f2-4ddc-a1ce-9a635335a4b4 qui est stocké dans une variable de mon code.

ex:

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

Comment puis-je le faire? Je suis tombé sur re.escape () et en utilisant 'lookahead négatif', il n'est pas très clair comment utiliser re.escape et re.findall () ensemble. Toutes les suggestions seront très appréciées.

TIA


3 commentaires

Quelle est la valeur de volume_show ?


volume_show est la chaîne contenant le child.before () [J'utilise pexcept]. Donc volume_show = "root @ test # cinder image-metadata-show 9a4d222b-a6f2-4ddc-a1ce-9a635335a4b4 | grep 'image_id' | cut -d '|' -f3 46519bdf-3ae9-44e2-acce-bd1ac76fd523 "


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


3 Réponses :


0
votes

Vous ne pouvez pas effectuer de post-traitement? comme

output = [x for x in output if x != vol_id]


1 commentaires

Oui je peux le faire. Mais le code n'est pas assez efficace dans mon cas. Vous cherchez quelque chose qui peut être fait en utilisant re.findall (). En ce moment, je fais le post-traitement lui-même.



0
votes

Vous pouvez utiliser un modèle d'anticipation négatif:

re.findall(r"(?!%s)(\w+-\w+-\w+-\w+-\w+)" % vol_id, volume_show)


1 commentaires

Cela n'a pas fonctionné, il n'a échappé qu'au tout premier personnage. par exemple re.findall ("(\ w + - \ w + - \ w + - \ w + - \ w +)", volume_show)) la sortie est ['9a4d222b-a6f2-4ddc-a1ce-9a635335a4b4', '46519bdf-3ae9-44e2- acce-bd1ac76fd523 '] où comme re.findall (r "(?!% s) (\ w + - \ w + - \ w + - \ w + - \ w +)"% vol_id, volume_show) la sortie est [' a4d222b-a6f2-4ddc -a1ce-9a635335a4b4 ',' 46519bdf-3ae9-44e2-acce-bd1ac76fd523 ']



1
votes

Vous pouvez ajouter des caractères au début de votre expression régulière pour faire correspondre les débuts et les retours à la ligne. Voici une modification de votre expression qui correspond à un début de ligne ^ ou à un caractère de nouvelle ligne \ n une quantité variable d'espaces \ s * puis votre 4 groupes alphanumériques: [\^\n \s*(\w+-\w+-\w+-\w+-\w+)

Et voici à quoi cela ressemble dans une session python:

< pré> XXX


0 commentaires