2016-06-06 10 views
5

Nehmen wir an, wir haben eine lange anzeigbare Zeichenfolgenvariable mystr. Wir haben ein Regex-Muster sagen substr_pattern und eine Teilstring passend zu diesem Muster ist aus mystr ausgefiltert werden und zu einer anderen Variablen substr zugewiesen werden. Es scheint keinen offensichtlichen Weg zu geben, dies in ansible aus den Dokumenten auf playbook_filters zu tun, obwohl es einfach ist, dies mit re Modul in Python selbst zu tun.Filtern Sie eine Teilzeichenfolge, die einem Muster aus einer ansible-Variablen entspricht, und weisen Sie einer anderen Variablen eine übereinstimmende Teilzeichenfolge zu

Es gibt drei Methoden in den ansible docs gegeben und keiner von ihnen scheint mein Problem zu lösen:

  1. match: Dieser Filter liefert true/false je nachdem, ob das gesamte Muster die gesamte Zeichenfolge entspricht aber tut gibt keine übereinstimmende Gruppe/Unterzeichenfolge zurück.

  2. search: Wird verwendet, um substr in einer größeren Zeichenfolge zu filtern. Aber wie match, gibt nur wahr/falsch und nicht übereinstimmende Gruppe/Teilzeichenfolge, die hier benötigt wird.

  3. regex_replace: Dies wird verwendet, um ein übereinstimmendes Muster in einer Zeichenfolge durch eine andere Zeichenfolge zu ersetzen. Es ist jedoch nicht klar, wie die dem übereinstimmenden Muster entsprechende Teilzeichenfolge/Gruppe in eine neue Variable registriert wird.

Gibt es etwas, das ich vermisse? Oder ist das ein fehlendes Merkmal in Ansible?

ansible Version: 2,1

Beispiel:

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 

Zusammenfassung: Wie den Teil erhält die pattern von mystr und registriert, dass zu einer ansible Variable substr passend?

Antwort

9

Wenn Sie das Muster ändern können, können Sie den Filter regex_replace verwenden und die gesamte Zeichenfolge durch nur die übereinstimmenden Ziffern ersetzen.

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

Um das Ergebnis einer neuen Variablen zuweisen, können Sie das set_fact Modul verwenden können.

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

Das ist brillant und so einfach. Ich frage mich, warum mir das vor dem Posten nicht in den Sinn kam! Würde noch hoffen, dass ansible einige Filter hinzufügt, die es ermöglichen, übereinstimmende Gruppen direkt zu erfassen. Ihre Lösung war für mich zunächst nicht besonders offensichtlich, da ich von Python ausging, ging ich davon aus, dass es einen Weg gibt, auf passende Gruppen wie 'match_obj.groups() [index]' zuzugreifen –

Verwandte Themen