Ktoś poprawi prosty pattern do "wyciągania" wartości dla zmiennej z ciągów Zmienna = wartość?

0

Pomoże ktoś, tak proste że chyba wstyd o to pytać? A ja już 2 dni siedzę i próbuję coś z tym zrobić.

pattern = r'[FLTSIM.(.?)][\s\S]?title\s?=\s?"(.?)"[\s\S]?texture\s?=\s?"(.*?)"'

Pattern powyżej, pobiera wartości umieszczone w cudzysłowach dla tile i texture. No i to działa.
Co należało by w nim zmienić, by rozpoznawał też wartości, które nie są ograniczone cudzysłowami. Tak jak w przypadku sekcji [fltsim.1]

Pod fltsim.1 widzimy, że dodatkowym utrudnieniem, może być

  • w wartości mogą się znaleźć spacje
  • nieistotny opis występujący po średniku. Też z różną ilością lub nawet brakiem spacji. UWAGA, zamiast spacji wstawiłem kropki, bo po zatwierdzeniu komentarza puste spacje nie są wyświetlane.
  • jakieś nieistne białe znaki, mogące utrudnić wyodrębnienie wartości.
  • wszędzie ilość spacji może być różna, chociaż przyjmijmy raczej, że początkowe 'tile =' 'texture =' zawsze wyglądają właśnie tak.

[FLTSIM.0]
title = "Mig-15"
texture = ""

[FLTSIM.1]
title = Mig-15 Corea War .......................;.........Variation name
texture = .................Corea;texture folder

Pomożecie. Nie znam się na programowaniu, choć kiedyś 20-30l. temu jako młody trochę się tym interesowałem. Przez 2 dni nie udało mi się poprawić by zawsze odpowiednio działało. Ostatnia moja próba to:
pattern = r'[FLTSIM.(.?)][\s\S]?(?:title|texture)\s=\s(.?)\s?(?:;|$)'

Skrypt z tym patternem był napisany by umożliwić kasowanie niepotrzebnych malowań z dodatków do Microsoft Flight Simulator, ale właśnie nie działa odpowiednio z niektórymi plikami aircraft.cfg
del2.zip

0

Założywszy, że “title” będzie zawsze przed “texture”.

pattern = r'\[FLTSIM\.([^\]]*)\].*?\ntitle\s*=\s*"?([^\n"]*).*?\ntexture\s*=\s*"?([^\n"]*)'

Jeśli taka kolejność nie jest gwarantowana, to trzeba by dzielić na sekcje “FLTSIM” i wyciągać teksty. No i nie wiadomo, czy cały tekst linii czy tylko do średnika.
Python ma moduł configparser.

2

Swoją drogą to ta zawartość przypomina format TOML. Może jakaś biblioteka z listy ułatwiłaby rozwiązanie problemu?

2

Tu jest fajna stronka do testowania regexów:
https://regex101.com/
wygodne, bo można sobie to zwizualizować i posprawdzać.

Ferdynand Lipski napisał(a):

Swoją drogą to ta zawartość przypomina format TOML. Może jakaś biblioteka z listy ułatwiłaby rozwiązanie problemu?

No ale też mi się wydaje, że nie ma co na siłe regexpów robić. To jest jakiś format, więc jeśli można użyć gotowego parsera, to po co się chrzanić z regexpami?

Ba, napisanie takiego parsera też nie jest jakieś trudne. Lecisz znak po znaku i ustalasz na tej podstawie odpowiedni stan parsera (w zasadzie lexer/tokenizer wystarczy).

[FLTSIM.0]

Np. widzisz, że jest [, to ustalasz stan, że czekasz na nazwę. Potem w tym stanie dalej iterujesz znak po znaku, aż będzie ] i wtedy wiesz, że należy wyciąć wszystko od [ do ] czyli FLTSIM.0. I tak dalej. Ogólnie to się da zrobić na pętli i kilku switchach/ifach w środku i na zmiennych odpowiadających za konkretny stan parsera.

Myślę, że wiele takich problemów około-regexpowych by zniknęło, gdyby programiści zamiast męczyć się z regexpami, nauczyli się pisać proste parsery.

pilot napisał(a):

Pomożecie. Nie znam się na programowaniu, choć kiedyś 20-30l. temu jako młody trochę się tym interesowałem. Przez 2 dni nie udało mi się poprawić by zawsze odpowiednio działało.

Chociaż jeśli to twoja krótka przygoda z programowaniem po latach i nie zamierzasz dłużej programować, to być może lepiej będzie poszukać gotowej biblioteki, albo już lecieć na tych nieszczęsnych regexpach. Z drugiej strony już przez 2 dni nie udało ci się poprawić. Więc już trochę czasu straciłeś na tych regexpach, a pewnie stracisz jeszcze więcej (chyba, że znajdziesz bibliotekę, jeśli to jakiś konkretny format konfiguracji jak TOML, to wtedy powinny być biblioteki).

0

Hmm, a nie pomoże w tym trochę bilbioteka od @Riddle ? https://github.com/T-Regx/T-Regx

Przynajmniej nie trzeba pisać zwykłego regexa.

0

Dobra chłopaki, wydawało mi się że to prosta sprawa, a nad patternem 3 dzień siedzę i ani kroku dalej. Przyznam się, że ten skrypt w Pythonie to dzieło AI - ChatGPT, próbowałem też kilku innych AI ale efekty były gorsze. Miało być tylko dla mnie, bo czekam na coś podobnego 3 lata. A że 80-95% przypadków działa i w efekcie program mi się spodobał to skompilowałem i udostępniłem na fsim.to
Pewnie skompilować z bibliotekami, o których piszecie dałoby radę, tak by ci co ściągnęli nie musieli instalować Pythona i bibliotek. Ale nie wiem czy jest sens.

Ja już wcześniej ze 2 czy 3 razy robiłem z AI, ale zwykłe pliki wsadowe tyle, że bardzo złożone i naprawdę rewelacja.
W tym przypadku utknęliśmy. Jeśli ktoś z was ma jakieś pomysły, a święta przecież i dużo czasu wolnego :P to chętnie skorzystam.
Całkiem fajna jest ta strona z testowaniem regex'sów, ale dziwne że moje patterny i sekcje malowań, które działają czyli z cudzysłowami tam pokazuje, że pattern nie działa. ALbo ja czegoś nie rozumiem.

1

pattern = r'[FLTSIM.(.?)][\s\S]?title\s?=\s?"(.?)"[\s\S]?texture\s?=\s?"(.*?)"'

Nie wiem, czy jest sens analizować to jednym regexpem.

pilot napisał(a):

[FLTSIM.0]
title = "Mig-15"
texture = ""
[FLTSIM.1]
title = Mig-15 Corea War .......................;.........Variation name
texture = .................Corea;texture folder

Jeżeli to ma mieć taką strukturę i jeśli zawsze tam będą entery po kolejnych deklaracjach, to jeśli chcesz to regexpami załatwić, to łatwiej będzie iterować linijka po linijce, i w każdej linijce testować kilka regexpów (osobny do łapania [COŚTAM], osobny do łapania gówno = dupa itp.).
Np.
coś takiego mi się wymyśliło do łapania deklaracji ze znakiem równa się:
(\w+) *=((.*?)(;|\n))|(\".*?\")

screenshot-20240331042437.png

W każdym razie możesz lecieć linijka po linijce i testować. I mieć gdzieś zmienną, która odpowiada za aktualną sekcję. I jak wykryjesz coś w nawiasach kwadratowych np. [FLTSIM.0], to możesz przypisać do zmiennej, że aktualna sekcja to "FLTSIM.1". I to może być potem klucz w słowniku.

Potem możesz wyłapywać kolejne sekcje klucz = wartość (np. tym czy podobnym regexpem, co wrzuciłem wyżej), i przypisywać do kolejnego słownika wartości (słownik wielopoziomowy) np.

values[section][key] = value

gdzie key i value to wykryty z pliku klucz i wartość np. "title", "Mig-15", section to wykryta sekcja np. "FLTSIM.1".

Pewnie skompilować z bibliotekami, o których piszecie dałoby radę, tak by ci co ściągnęli nie musieli instalować Pythona i bibliotek. Ale nie wiem czy jest sens.

Tzn. w jakim języku to piszesz i w jaki sposób chcesz dystrybuować?
Jeżeli nie chcesz, żeby inni mieli problem, ale też nie chcesz mieć samemu problemu, to pewnie w JavaScript najłatwiej byłoby to dystrybuować, bo robisz zwykłą stronę HTML/JS i wrzucasz choćby na Github Pages, to darmowe jest. I zrobić jakiś textarea do wklejania zawartości pliku i przycisk, który po kliknięciu by brał ten tekst i parsował.
A potem dać ludziom adres strony i tyle.

0
LukeJL napisał(a):

(\w+) *=((.*?)(;|\n))|(\".*?\")

Na tej stronie do testowania pięknie mi wykrywa.
Ale ogólnie to ja niewiele rozumiem co do mnie piszesz, nawet raczej ze wskazaniem, że nic nie rozumiem. A po prawie 3 dniach nad tamtym patternem i ciągłego poznawania umysłu AI ChatGpt i uczenia się odpowiednich z nim interakcji to jestem wykończony.

Pozwoliłem sobie przeredagować to co napisałeś i mu to zamieściłem:

ad.:
pattern = r'[FLTSIM.(.?)][\s\S]?title\s*?=\s*?"(.?)"[\s\S]?texture\s*?=\s*?"(.*?)"'

Nie wiem, czy jest sens analizować to jednym regexpem.

[FLTSIM.0]
title = "Mig-15"
texture = ""

[FLTSIM.1]
title = Mig-15 Corea War ; Variation name
texture = Corea;texture folder

jeśli chcesz to regexpami zrobić, to łatwiej będzie iterować linijka po linijce, i w każdej linijce testować kilka regexpów (osobny do łapania [fltsim.X], osobny do łapania title i texture itp.).
Np. coś takiego można by zastosować do łapania deklaracji ze znakiem równa się:
(\w+) =((.?)(;|\n))|(" *?")

W każdym razie możesz lecieć linijka po linijce i testować. I nie używać zmiennej, która odpowiada za aktualną sekcję. I jak wykryjesz coś w nawiasach kwadratowych np. [FLTSIM.0], to możesz przypisać do zmiennej, że aktualna sekcja to "FLTSIM.0". I to może być potem klucz w słowniku.

Potem możesz wyłapywać kolejne sekcje klucz = wartość (np. waśnie tym: (\w+) =((.?)(;|\n))|(".*?")
czy podobnym regexpem), i przypisywać do kolejnego słownika wartości (słownik wielopoziomowy) np.

values[section][key] = value
gdzie key i value to wykryty z pliku klucz i wartość np. "title", "Mig-15", section to wykryta sekcja np. "FLTSIM.1".

Rozumiesz to co napisałem wyżej, możesz zmienić poniższy skrypt tak skrypt by wzięte było to pod uwagę?

.................................................................................
I wypluł mi skrypt, który zamieściłem w załączniku. Jednak po uruchomieniu skrypt nie wyświetla, żadnego ze specjalnie spreparowanych pod AI malowań. Próby naprawy, nie pomogły.

Nie dałbyś rady w wolnym czasie, zobaczyć co on z tego zrobił? Niekoniecznie dzisiaj, niekoniecznie jutro. Ja sam mam też trochę dość. Wiem, że nie łatwo tak, bo ciężko czyjeś kody przeglądać i to nie będąc w temacie. Aha, w tych sekcjach dałem kropki zamiast spacji, bo tutaj po zamieszczeniu komentarza puste spacje są wycinane. Ale to chyba i tak nie ma znaczenia

A skrypt i kompilację zamieszczam, jak wyżej pisałem na stronie fsim.to wraz z krótkim opisem i użytkownicy ściągają sobie zipa. Miało być tylko dla mnie, wyszło całkiem nieźle już po 10 minutach współpracy z AI. Skrypt wyświetla podgląd-obrazek wybieranego do skasowania malowania. I zamieściłem, ale jakiegoś specjalnego powodzenia nie programik nie ma. Co jest nawet ciekawe, bo każde z malowań może zajmować 2-3GB, malowań może być nawet kilkanaście. Ręcznie malowania usunąć można ale jest to kłopotliwe, bo trzeba zmieniać w pliku konfiguracyjnym numerację wszystkich następujących po nim malowań. A gdy pojawi się updejt samolotu trzeba wszystko powtarzać. Symulator wraz z dodatkami zajmuje mi blisko 4GB na SSD, a oprócz tego używam symbolic linka i około 2GB niektórego typu danych poszło na HDD.

Link bezpośredni do tego skryptu na tamtej stronie, chociaż nie wiem czy tutaj mogę dawać linki: https://pl.flightsim.to/file/71800/liveries-deleter
Chętnie tam wspomnę o pomocy od ciebie :) i o tym forum.

del2forum.zip[del2forum.zip]

0
LukeJL napisał(a):

coś takiego mi się wymyśliło do łapania deklaracji ze znakiem równa się:
(\w+) *=((.*?)(;|\n))|(\".*?\")

eh, się napisałem a komentarz się nie zamieścił. Pewnie przez linka, który zamieściłem.
Może napiszę jeszcze raz ale za jakiś czas. Temat, śledzę choć niewiele rozumiem.

0

ChatGPT pomylił kropkę ze znakami odstępu w wyrażeniach regularnych oraz niepotrzebnie dwa razy otwierał plik do odczytu już posiadanych danych.
Załączam trochę poprawioną wersję: del2forum.zip.

I dla usuwania wielu naraz: del_multi.zip.

1 użytkowników online, w tym zalogowanych: 0, gości: 1