Kłopotliwe wyrażenie regularne

0

Cześć,

potrzebuję pomocy z wyrażeniem regularnym, które z pliku przetrzymującego opcje programu wyłuska mi nazwę i wartość zmiennej.

przykładowo mam opcję:
`
no_sound=yes
no_video=no
'

potrzebuję wyłuskać tylko jeden wiersz.

3

a gdzie to wyrażenie z którym masz problem?
to wygląda jak plik ini więc czemu nie użyjesz czegoś do obsługi plików ini zamiast zaprzęgać do tego kosztowne wyrażenia regularne
https://stackoverflow.com/questions/8884188/how-to-read-and-write-ini-file-with-python3

0

wyrażenie następujące:
`re.sub('[^(no_sound).*$]', '', conf.file)'

zwraca mi pożądany rezultat, gdyby nie doklejał negację z pozostałych wierszy.
Linkowi się przyjrzę, dzięki.

3

Kłopotliwe wyrażenie regularne - nazwanie "wyrażenia regularnego" kłopotliwym to pleonazm. Takie masło maślane :D trochę jak "manipulująca
telewizja".

Mnie się wydaje, że źle do tego podchodzisz i lepiej byłoby albo użyć gotowego parsera, albo zrobić to ręcznie, ale linijka po linijce i każdą linijkę z osobna analizować, zamiast popełniać rozrywkę intelektualną typu "układanie magicznego regexpa, które sparsuje cały plik za jednym zamachem".

Jeśli format pliku polega na tym, że masz JAKIEŚ_SŁOWO=JAKAŚ WARTOŚĆ, to to można nawet głupim split sparsować:

line = "no_sound=yes"
print(line.split("=")) # ['no_sound', 'yes']

i masz już wyłuskane wartości i możesz je do słownika dać (tylko, że to jest optymistyczna wersja, w rzeczywistości w plikach pisanych przez ludzi zawsze możesz mieć jakieś edge case'y, nawet typu, że ktoś spacje dodał przed znakiem równości i już zamiast "no_sound" masz "no_sound ". itp. itd. więc wtedy mógłbyś użyć strip oraz sprawdzić, czy nie będzie innych edge case'ów.

Ale nie wiem, co masz za pliki. Czy cały format to tylko XXX=YYY czy może w tych plikach może być wszystko? Czy to jest jakiś znany format? (wtedy na pewno masz dostępne jakieś gotowe parsery).

2

Taki najprostszy regex to będzie

>>> text = """
... no_sound=yes
... no_video=no
... """
>>> match = re.search('no_sound=(yes|no)', text)
>>> if match:
...     match.group(1)
... 
'yes'

Ale najprościej to po prostu trzymaj swoją konfigurację w pliku pythona

no_sound = True
no_video = False

Wówczas wystarczy import

from config import no_video
0

Dzięki Panowie!

Rozwiązanie typu jak przedstawił Spearhead stosowałem w BASHu, bardzo fajne. Dzięki.
Ostatecznie zdecydowałem się na configparser.

Wszystkie odpowiedzi cenne.
Pozdrawiam

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.