2016-06-06 24 views
5

Diciamo che abbiamo una variabile di stringa long ansible mystr. Abbiamo un modello regex che dice substr_pattern e una sottostringa che corrisponde a questo modello deve essere filtrata da mystr e deve essere assegnata a un'altra variabile substr. Non sembra esserci un modo ovvio per farlo in ansible dai documenti su playbook_filters sebbene sia semplice farlo con il modulo re in python stesso.Filtra una sottostringa che corrisponde a un modello da una variabile ansibile e assegna una sottostringa corrispondente a un'altra variabile

Ci sono 3 metodi riportati nella documentazione ansible e nessuno di loro sembra risolvere il mio problema:

  1. match: Questo filtro restituisce true/false a seconda che l'intero modello corrisponde l'intera stringa, ma fa non restituire il gruppo/sottostringa corrispondente.

  2. search: utilizzato per filtrare il substr in una stringa più grande. Ma come match, restituisce solo vero/falso e non corrispondente gruppo/sottostringa che è necessario qui.

  3. regex_replace: viene utilizzato per sostituire un motivo con corrispondenza in una stringa con un'altra stringa. Ma non è chiaro come registrare la sottostringa/gruppo corrispondente al modello abbinato in una nuova variabile.

C'è qualcosa che mi manca? O questa è una caratteristica mancante in ansible?

Ansible Versione: 2,1

Esempio:

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 

Sommario: Come ottenere la sottostringa corrispondente al pattern da mystr e registrare che ad una variabile ansible substr?

risposta

9

Se è possibile modificare il motivo, è possibile utilizzare il filtro regex_replace e sostituire l'intera stringa con solo le cifre corrispondenti.

mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1') 

Per assegnare il risultato a una nuova variabile, è possibile utilizzare il modulo set_fact.

- set_fact: 
    substr: "{{ mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1') }}" 
+0

Questo è geniale e semplice. Mi chiedo perché questo non mi è venuto in mente prima di postare! Spererei ancora che ansible aggiunga alcuni filtri che consentono di catturare direttamente i gruppi abbinati. All'inizio la tua soluzione non mi era del tutto ovvia, dato che provenendo da Python stavo assumendo che ci sia un modo per accedere ai gruppi abbinati direttamente come 'match_obj.groups() [index]' –

Problemi correlati