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 Réponses :
Vous ne pouvez pas effectuer de post-traitement? comme
output = [x for x in output if x != vol_id]
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.
Vous pouvez utiliser un modèle d'anticipation négatif:
re.findall(r"(?!%s)(\w+-\w+-\w+-\w+-\w+)" % vol_id, volume_show)
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 ']
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
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)