RegExp, poszukiwanie wyrazu "z wyjątkiem"


(sexy69bis) #1

Chcę znaleźć łańcuch zawierający
każdą herbatę za wyjątkiem herbaty Yunnan

Yunnan Liściasta Herbata
Yunnan Herbata Liściasta
Lipton Herbata Liściasta
Herbata Yunnan Black
Herbata Liściasta Yunnan

Jak powinien wyglądać wzór?

RegEx używam w: VBScript, Total Commander i AkelPad (edytor tekstu)


(Fizyda) #2

Będzie bardzo ciężko zwłaszcza w przypadku gdy Yunnan jest przed Herbata ze względu na:

W przypadku asercji wstecznych (ang. lookbehind) implementacja dla Pythona dopuszcza skończoną i ustaloną długość wzorca e. Zatem użycie operatora Kleen’a * lub operatora zakresu {n,m} jest niedozwolone w asercji wstecznej.

http://home.agh.edu.pl/~mkuta/tk/WyrazeniaRegularne.html

Najlepsze co udało mi się ogarnąć to:

Wydaje mi się, że trzeba byłoby to zrobić jakby na dwa razy. Najpierw przefiltrować linie i zostawić tylko te które mają w nazwie herbate, potem wywalić wszystkie które mają w nazwie Yunnan. Raczej tego nie osiągniesz w TC czy edytorze tekstu. Generalnie to co robisz to powinna być już do tego baza danych i przygotowane odpowiednie zapytania filtrujące dane, bo wyrażenia regularne tutaj to kiepski pomysł.


(sexy69bis) #3

(?<!e) dopasowuje łańcuch, jeśli bezpośrednio przed nim nie następuje wyrażenie pasujące do e (ang. negative lookebehind)
(?!e) dopasowuje łańcuch, jeśli bezpośrednio po nim nie następuje wyrażenie pasujące do e (ang. negative lookeahead)

problem, gdy Herbata i Yunnan nie są obok siebie,

Herbata Liściasta Lipton
Yunnan Liściasta Herbata
Herbata Liściasta Yunnan

Czy jest jakiś trik aby wykluczyć z wyników wyszukiwania w RegExp: Yunnan?

ale… już nie przy pomocy RegExp :grinning:

PS. znalazłem w opisie RegExp takie coś…
\A początek tekstu
\Z koniec tekstu
Jak to używać?


(Fizyda) #4

To tak jak napisałem trzeba byłoby napisać jakiś skrypt który przefiltruje dane i wyświetli lub zapisze w osobnym pliku tylko te co Cię interesują, ale to jest dokładnie jedna z funkcjonalności jaką oferuje baza danych, więc jeśli tych produktów masz sporo i lista ich rośnie dodatkowo mają one jakieś inne wartości to ja bym z tym przeszedł do bazy danych i zrezygnował z plików.
Ciężko jednak coś doradzić bo nic nie wiem o tym jaki charakter mają te dane, skąd pochodzą i do czego ich używasz, być może baza danych to zły pomysł.

Ja nie wiem czy da się to zrobić przy pomocy wyrażeń regularnych bo to nie jest wyszukiwanie ciągów znaków, a filtrowanie danych, a do tego wyrażenia nie zostały stworzone.

Gdy wiesz, że np. szukasz tylko jakiegoś ciągu znaków na początku lub końcu tekstu. W tym przypadku nic Ci to nie pomoże ponieważ musiałbyś użyć kilku wyrażeń regularnych po sobie które filtrowałyby dane, a one do tego nie służą.

Wyrażenia regularne służą do odnajdywania w tekście jakiegoś fragmentu zgodnego z wyrażeniem, to co Ty chcesz zrobić to flirtowanie danych, a nie wyszukiwanie.


(sexy69bis) #5

Mam bardzo dużo plików tekstowych “napisy do filmów”.
Przeszukuję je często Total Commanderem, aby znaleźć jakieś
zwroty lub całe linie.

Również przeszukuję skrypty VBS lub AHK.
Nie wiem jak ta baza danych mnie to by ułatwiła, biorą pod uwagę,
że to trzeba by było na bieżąco aktualizować.
Prościej chyba napisać skrypt uzupełniający
w VBS, używając tam również RegExp.


(sexy69bis) #6

“InformatykPiotr”

Nie zauważyłem większego zainteresowania tym tematem niż na poprzednim dziale…:grinning:


(Fizyda) #7

Do poprzedniego działu nie zaglądam, na temat trafiłem przypadkiem :stuck_out_tongue:. Tutaj było odwrotnie sprawdzałem dział i trafiłem na temat.

To była propozycja dotycząca herbat bo wyglądało to na bazę produktów, w tedy prawdopodobnie miałoby to sens. W przypadku przeszukiwania napisów do filmów już takiego sensu nie ma.

Myślę, że jakiś własny skrypt byłby chyba najlepszym rozwiązaniem. W tedy sprawdzasz sobie pliki i każdą linijkę walidujesz względem dwóch wyrażeń regularnych (bo są szybsze). Pierwsze sprawdza czy występuje wyraz XXX, drugie sprawdza czy nie ma w tej linijce wyrazu YYY. Jeśli jest pierwszy i nie ma drugiego to masz dopasowanie, a jak nie szukasz dalej.

Z VBS nie pomogę bo to dla mnie jak chiński, no dobra łatwiejszy, ale nie chcę mieć do czynienia z tym językiem.

Skrypt/program będzie inaczej wyglądał w zależności od tego co szukasz, jak jest zapisane oraz jak chcesz widzieć wyniki. Dlatego nie umiem Ci podpowiedzieć więcej szczegółów. Poza tym obawiam się, że będziesz musiał go edytować w zależności od potrzeby, o ile jeszcze listę szukanych wyrazów i listę wyrazów które mają się nie pojawiać ogarniesz regexpem to mogą pojawić się sytuacje gdzie będziesz potrzebował zmienić logikę filtrowania. No ale 90% kodu zostanie bez zmian i tak, więc o ile umiesz programować choćby trochę to moim zdaniem będzie to najlepsze rozwiązanie.


(sexy69bis) #8

VBS to odpowiednik VB6. A czy Chiński… to możliwe,
że mają w nim swój udział. :grinning:
Bardzo dobrze sobie z nim radzę. Dla własnych potrzeb wystarczający.
Trochę przestarzały, ale wygodny, tylko jeden plik tekstowy.
Gdy chcę coś w nim poprawić, to otwieram notatnikiem
zamykam i gotowe. Żadnych kompilacji do aplikacji exe i trzymania
poszczególnych części do kompilacji lub poprawienia jego zawartości.
Gdyby RegExp więcej potrafił, to skróciłoby cały kod VBS i nie tylko.