Disons que nous avons une longue variable de chaîne ansible mystr
. Nous avons un modèle d'expression régulière dire substr_pattern
et une sous-chaîne correspondant à ce modèle doit être filtrée de mystr
et être affectée à une autre variable substr
. Il ne semble pas y avoir de moyen évident de le faire en ansible à partir des documents sur playbook_filters bien qu'il soit simple de le faire avec le module re
dans python lui-même.
Il existe 3 méthodes données dans la documentation ansible et aucune ne semble résoudre mon problème:
match
: ce filtre renvoie vrai/faux selon que le motif entier correspond à la chaîne entière mais ne renvoie pas le groupe/sous-chaîne correspondant.
search
: utilisé pour filtrer les substr dans une chaîne plus grande. Mais comme match
, retourne uniquement vrai/faux et non groupe/sous-chaîne correspondant qui est nécessaire ici.
regex_replace
: Ceci est utilisé pour remplacer un modèle correspondant dans une chaîne par une autre chaîne. Mais il n'est pas clair comment enregistrer la sous-chaîne/le groupe correspondant au modèle correspondant dans une nouvelle variable.
Y a-t-il quelque chose qui me manque? Ou est-ce une fonctionnalité manquante dans ansible?
Version Ansible: 2.1
Exemple:
mystr: "This is the long string. With a url. http://example.org/12345"
pattern: "http:\/\/example.org\/(\d+)"
substr: 12345 # First matched group i.e. \\1
Résumé: Comment obtenir la sous-chaîne correspondant au pattern
de mystr
et l'enregistrer dans une variable ansible substr
?
Si vous pouvez modifier le modèle, vous pouvez utiliser le regex_replace
filtre et remplace toute la chaîne par les seuls chiffres correspondants.
mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1')
Pour affecter le résultat à une nouvelle variable, vous pouvez utiliser le set_fact
module.
- set_fact:
substr: "{{ mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1') }}"