Wpis z mikrobloga

#regex #programowanie
Zagadka regexowa
Plik(i) w ktorych mamy wiele wystapien pewnego strina o przykladowym formacie

ayy\n(lmao\d\n)+

czyli przykladowo

ayy
lmao1
lmao2
lmao3

chcemy zamienic na

ayy
ehh(lmao\d)
ehh(lmao\d)
ehh(lmao\d)

ilosc powtorzen linii lmao\d jest nieznana, ale dodatnia
ayy musi koniecznie byc pierwsza linia

Ktos wie jaki regex zlapie i zamieni taki string?
  • 10
ayy1
lmao1
lmao2
lmao3
ayy1
lmao1
lmao2
lmao3
....

#!/usr/bin/python

import re
with open("file") as f:
data = f.read()
d = dict(re.findall('(ayy\d)\n((?:lmao\d\n)+)', data, re.M))
for x in d:
list_lmao = d[x].split()
....
....

Nie wiem czy o to ci chodziło.
Wyciągasz pojedyncze linie możesz użyć od razu re.replace..
Rozwiązań jest masa łatwiej było by jak byś podał lepsze dane, jeśli "ayy" jest zawsze jest stałym literałem, a konstrukcja lmao jest też stała
@alien3211
@pingwindyktator
W pythonie to nie problem (tak to ostatecznie rozwiązałem). Raczej byłem ciekawy czy w ogóle da się to zastąpić sedem.

sed 's/\(lmao\d\)/ehh(\1)/'


To niestety zamieni każdą linie lmao, a mi zależy konkretnie na tych które są poprzedzone linia ayy( n linii lmao bezpośrednio po jednej linii ayy).
poczytaj trochę o lookahead/Lookbehind w regexach. one działają podobnie jak if.
ewentualnie wykorzystaj awk, perl, ostatecznie basha czyli połączenie wszystkiego jeśli nie chcesz perla :)
w sed można tworzyć zmienne i łączyć wyszukiwania. polecam do seda, awk, regex, etc
do testowania polecam stronę regex101.com - ma fajny debuger regexow + fajnie rozwija składnie danego regexa