2016-06-06 36 views
5

Załóżmy, że mamy długą kolumnową zmienną łańcuchową mystr. Mamy wzór regex: substr_pattern, a podciąg pasujący do tego wzorca zostanie odfiltrowany z mystr i zostanie przypisany do innej zmiennej substr. Wydaje się, że nie ma żadnego oczywistego sposobu, aby to zrobić w ansibla z dokumentacji na temat playbook_filters, choć łatwo jest to zrobić z modułem re w samym pythonie.Filtrowanie podciągu pasującego do wzorca ze zmiennej ansibli i przypisywanie dopasowanego podciągu do innej zmiennej

Istnieją 3 metody podane w ansibl docs i żaden z nich nie wydaje się rozwiązać mój problem:

  1. match: Ten filtr zwraca true/false w zależności od tego, czy cały wzorzec pasuje cały ciąg ale robi nie zwraca dopasowanej grupy/podciągu.

  2. search: Używany do filtrowania substr w większym ciągu. Ale podobnie jak match, tylko zwraca true/false i nie pasuje grupy/podciągu, który jest potrzebny tutaj.

  3. regex_replace: Służy do zamiany pasującego wzorca w ciągu na inny ciąg. Ale nie jest jasne, jak zarejestrować podłańcuch/grupę odpowiadającą dopasowanemu wzorowi w nową zmienną.

Czy jest coś, czego mi brakuje? Czy jest to brakująca cecha w ansiblu?

ansibl Wersja: 2,1

Przykład:

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 

Podsumowanie: Jak uzyskać podciąg pasujący do pattern z mystr i zarejestrować się, że do ansibl zmiennej substr?

Odpowiedz

9

Jeśli możesz zmodyfikować wzór, możesz użyć filtru regex_replace i zastąpić cały ciąg tylko dopasowanymi cyframi.

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

Aby przypisać wynik do nowej zmiennej, można użyć modułu set_fact.

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

To jest genialne i takie proste. Zastanawiam się, dlaczego nie przyszło mi to do głowy przed publikacją! Nadal mam nadzieję, że ansible dodaje kilka filtrów, które umożliwiają bezpośrednie przechwytywanie dopasowanych grup. Twoje rozwiązanie na początku nie było dla mnie zbyt oczywiste, ponieważ pochodząc z Pythona, zakładałem, że istnieje sposób na uzyskanie dostępu do dopasowanych grup bezpośrednio, takich jak 'match_obj.groups() [index]' –