Wyrazenia regularne

Użytkowanie arkusza kalkulacyjnego
MILESIU
Posty: 11
Rejestracja: wt lis 23, 2021 10:26 pm

Wyrazenia regularne

Post autor: MILESIU »

Witam,
nie bede tu pisal czego to ja nie sprawdzilem i gdzie nie szukalem. Po prostu nie moge rozwiklac problemu i licze ze tu uzyskam pomoc. Jest to wg mnie banalne pytanie, ale nie moge tego rozgryzc.

=REGEX(A1;"SZUKAM";"ZAMIENIAM")

A1 to komorka w ktorej szukam, SZUKAM to szukana fraza, ZAMIENIAM to fraza na ktora zamieniam.

w uproszeniu z A1SZUKAM zamienia mi na A1ZAMIENIAM, a chce na samo ZAMIENIAM

jak dam funkcje:
=REGEX(A1;"SZUKAM";"")

to mam w wyniku SZUKAM, co jest juz ok, ale optymalnie byloby gdybym sam mogl zadecydowac co wpisuje.

Ma ktos pomysl jak to zrobic?
Ostatnio zmieniony śr gru 01, 2021 10:53 pm przez MILESIU, łącznie zmieniany 1 raz.
LibreOffice na Windows 10 Wersja: 6.4.3.2 (x64)
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Wyrazenia regularne

Post autor: Rafkus »

Trochę Cię nie rozumiem, u mnie działa wszystko zgodnie z wyjaśnieniami kolegi @Jermora:
Jermor pisze: Gdy funkcja ma podane tylko dwa parametry, zwraca ten fragment tekstu źródłowego, który jest dopasowany do wzorca.
REGEX("Jana Pawła II 1234/6";"23") zwróci ciąg 23, gdyż takie dopasowanie zostało znalezione.
REGEX("Jana Pawła II 1234/6";"\d{2}"), zwróci ciąg 12, gdyż wzorzec określa konieczność znalezienia ciągu złożonego z dwóch dowolnych cyfr, a 12 jest pierwszym takim ciągiem.
Jeśli żaden fragment tekstu źródłowego nie pasuje do wzorca, zwracany jest wynik #N/D.
Trzeci argument funkcji to zamiennik dla dopasowanego fragmentu. Funkcja zwróci tekst źródłowy, zastępując dopasowany do wzorca fragment – zamiennikiem.
REGEX("Jana Pawła II 1234/6";"\d{2}";"xxxx") zwróci: Jana Pawła II xxxx34/6, zastępując dopasowany ciąg (12) zamiennikiem (xxxx). Jeżeli żaden fragment tekstu źródłowego nie zostanie dopasowany do wzorca, zwrócony zostanie oryginalny tekst źródłowy.
Link do pełnej treści jego postu: Funkcja REGEX w Calc (tylko LibreOffice)
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Wyrazenia regularne

Post autor: Jan_J »

@MILESIU
Jeśli podpowiedź wyżej nie wystarczy, to zamiast opisywać „w uproszczeniu”, opisz efekt na jakim Ci zależy i załącz dokładną kopię zastosowanej formuły. Wtedy będzie łatwiej zdiagnozować problem.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
MILESIU
Posty: 11
Rejestracja: wt lis 23, 2021 10:26 pm

Re: Wyrazenia regularne

Post autor: MILESIU »

Chaotycznie tlumacze, pewnie jakby mnie przebadali to by mi jakas literke wlepili ;)

REGEX("Jana Pawła II 1234/6";"\d{2}";"xxxx") zwróci: Jana Pawła II xxxx34/6, zastępując dopasowany ciąg (12) zamiennikiem (xxxx). Jeżeli żaden fragment tekstu źródłowego nie zostanie dopasowany do wzorca, zwrócony zostanie oryginalny tekst źródłowy.

" zwróci: Jana Pawła II xxxx34/6 "

a co zrobic zeby zwrocilo "xxxx" ?
LibreOffice na Windows 10 Wersja: 6.4.3.2 (x64)
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Wyrazenia regularne

Post autor: Jan_J »

Chcesz dostać "xxxx" w odpowiedzi na co?
* na "Jana Pawła II {dwie cyfry}{cokolwiek}"
* na "{cokolwiek}{dwie cyfry}{cokolwiek}"
We argumencie Znajdź musisz opisać takie wyrażenie, które obejmie całą frazę jaką chcesz dopasować.
Przykład wyżej dotyczył Znajdź: "\d{2}", więc zamienione zostało pierwsze wystąpienie dwóch cyfr. Całą reszta została bez zmian.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Wyrazenia regularne

Post autor: Rafkus »

A czemu ma zwrócić "xxxx" a nie wynik funkcji REGEX("Jana Pawła II 1234/6";"\d{2}";"xxxx") ??
W tej chwili wygląda tak to tak jakbyś jechał pociągiem do Warszawy a chcesz do Krakowa...

A może zamiast REGEXa potrzebujesz funkcję JEŻELI? JEŻELI jakiś warunek zostanie spełniony TO wypisz "xxxx" bo JEŚLI NIE to napisz coś innego. Formuła wyglądała by tak:

Kod: Zaznacz cały

=JEŻELI(jakiś_warunek; "xxxx"; coś_innego) 
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
MILESIU
Posty: 11
Rejestracja: wt lis 23, 2021 10:26 pm

Re: Wyrazenia regularne

Post autor: MILESIU »

To jest jeden z pomyslow, ktorego nie umiem zaimplementowac. Zakladajac ze REGEX nie sluzy do tego celu, w zasadzie brakuje prawie nic, zeby dzialalo tak jak chce, ale zakladajac ze nie jest do tego i sie uparli. To JEŻELI jest bardzo logiczne.

JEŻELI znalazłeś w komórce A1 frazę "aaaa" to wynik 1, jezeli nie znalazles to wynik 0. I cos takiego mnie by interesowalo. Bylbys tak uprzejmy, zeby napisac formule ? :)
Ja chce uzyskac proste dzialanie. Mam w kolumnach:

Ala ma kota
Ala na kota
Ala da kota

i tak milion razy. Chce znalezc wiersze w ktorych jest "na", niewazne czy tam sie znajdzie "kotana" bo ktos zle wpisal. Z tym bede walczyl kropkami, spacjami itp.

Czyli z powyzszego chce:

Ala ma kota, 0
Ala na kota, 1
Ala da kota, 0

a nie:

Ala ma kota, Ala ma kota
Ala na kota, Ala na kota1
Ala da kota, Ala da kota

, jako separator.
LibreOffice na Windows 10 Wersja: 6.4.3.2 (x64)
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Wyrazenia regularne

Post autor: Rafkus »

W LO można wyskrobać coś takiego:

Kod: Zaznacz cały

=JEŻELI.BŁĄD(ZNAJDŹ("na";A1);0)>0
Wynik to: PRAWDA lub FAŁSZ; - komórki można sformatować aby wyświetlany wynik był 1 lub 0
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
MILESIU
Posty: 11
Rejestracja: wt lis 23, 2021 10:26 pm

Re: Wyrazenia regularne

Post autor: MILESIU »

I to jest juz prawie to co chce, przy czym 0 i 1 podalem jako jakis tekst, a tu jest to traktowane jako prawda falsz, moje niedopatrzenie ze uzylem takich znakow.
Zalezy mi na tym, zebym mogł podac co tam ma byc. Wiec moze bardziej trafny bedzie taki przyklad.

Chce znalezc wiersze w ktorych jest "na" i jezeli jest wpisac "Tak ma" a jezeli nie ma to wpisac "Nie ma" lub zostawic puste.

Ala ma kota
Ala na kota
Ala da kota

Czyli z powyzszego chce np:

Ala ma kota, Nie ma
Ala na kota, Tak ma
Ala da kota, Nie ma

lub


Ala ma kota,
Ala na kota, Tak ma
Ala da kota,

a nie:

Ala ma kota, Ala ma kota
Ala na kota, Ala na kotaTak ma
Ala da kota, Ala da kota

, jako separator.
LibreOffice na Windows 10 Wersja: 6.4.3.2 (x64)
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Wyrazenia regularne

Post autor: Rafkus »

Piszę z telefonu, więc krótko:

Kod: Zaznacz cały

=JEŻELI (JEŻELI.BŁĄD(ZNAJDŹ("na";A1);0); "Tak ma" ; "Nie ma")
ewentualnie:

Kod: Zaznacz cały

=A1 &", " & JEŻELI (JEŻELI.BŁĄD(ZNAJDŹ("na";A1);0); "Tak ma" ; "Nie ma")
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
MILESIU
Posty: 11
Rejestracja: wt lis 23, 2021 10:26 pm

Re: Wyrazenia regularne

Post autor: MILESIU »

Szok niedowierzanie, to jest dokladnie to czego chce.

Kod: Zaznacz cały

=JEŻELI (JEŻELI.BŁĄD(ZNAJDŹ("na";A1);0); "Tak ma" ; "Nie ma")
Wielkie dzieki.

To jeszcze mam dwa pytania, podejrzewam ze ktos bedzie wiedzial.

1. Jak wylaczyc rozpoznawanie wielkosci liter? Zeby Na i NA rozpoznawalo jako warunek spelniony?
Jestem przekonany, ze sie da, bo jest opcja w ustawieniach i szukajce, ale w ustawieniach zmienilem i nic to nie daje.

2. Czy da sie wylaczyc rozpoznawanie polskich znakow, zeby "ną" czy "ńa" rozpoznawalo jako prawde?
LibreOffice na Windows 10 Wersja: 6.4.3.2 (x64)
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Wyrazenia regularne

Post autor: Rafkus »

Jeśli chodzi o pierwsze pytanie to zastąp funkcje ZNAJDŹ funkcją bodajże SZUKAJ - ona nie rozróżnia wielkości liter. Piszę bodajże bo w tej chwili piszę z pamięci - nie jestem przy komputerze więc mogę się mylić co do nazwy...
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
MILESIU
Posty: 11
Rejestracja: wt lis 23, 2021 10:26 pm

Re: Wyrazenia regularne

Post autor: MILESIU »

Super. Tak to teraz wyglada:

Kod: Zaznacz cały

=JEŻELI (JEŻELI.BŁĄD(SZUKAJ.TEKST($U$665290;U665278);0); "Tak ma" ; "Nie ma")
w komorce U665290 jest szukany tekst. Moze sie komus przyda.

Z tymi polskimi znakami to podejrzewam, ze moze byc jakis symbol, ale na liscie nie widze.
LibreOffice na Windows 10 Wersja: 6.4.3.2 (x64)
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Wyrazenia regularne

Post autor: Rafkus »

Można nieco skomplikować wcześniejszą formułę: =JEŻELI (JEŻELI.BŁĄD(ZNAJDŹ("na"; A1);0); "Tak ma" ; "Nie ma")
W powyższej formule zamiast odwołanie do komórki A1 można użyć tam funkcji:

Kod: Zaznacz cały

REGEX(LITERY.MAŁE(A1); "[nń][aą]"; "na")
Co ona robi:
Załóżmy, że w komórce A1 znajduje się tekst: "Ala Ną KOTA"
Funkcja REGEX dzięki funkcji LITERY.MAŁE(A1) w tekście : "ala ną kota"
będzie szukała wyrażenia: [nń][aą]. Taki zapis oznacza że poszukiwana fraza składa się z dwóch liter, których to litery są wymienione w nawiasach []. Zatem REGEX szuka wystąpienia następującej kombinacji: na, ną, ńa lub ńą,
Jeśli jakaś ta kombinacja wystąpi - zastąpi ją tekstem "na".

I teraz, w tak spreparowanym tekście funkcja ZNAJDŹ będzie sprawdzała czy znajduje się w nim.... ( ale to już zostało wyjaśnione wcześniej ;) )

Cała formuła wygląda zatem tak:

Kod: Zaznacz cały

JEŻELI (JEŻELI.BŁĄD(ZNAJDŹ("na"; REGEX(LITERY.MAŁE(A1); "[nń][aą]"; "na")); 0); "Tak ma"; "Nie ma")
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
MILESIU
Posty: 11
Rejestracja: wt lis 23, 2021 10:26 pm

Re: Wyrazenia regularne

Post autor: MILESIU »

Fakt skomplikowales, ale co trzeba wylonilem i juz mam sprawe zalatwiona :)
Regula zostaje jak byla poprzednio, ale w komorce U665290 wpisujemy:
[nń]a

inny przykład, bardziej przejrzysty(dla potomnych, bo obecnie zgromadzeni wiedza o co chodzi) szukamy "przód"

podaje:

prz[oó]d

szukam góra:

g[oó]ra

Dzieki za pomoc.
LibreOffice na Windows 10 Wersja: 6.4.3.2 (x64)
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Wyrazenia regularne

Post autor: Rafkus »

Fakt, REGEX nie potrzebny.

Tylko mała uwaga: aby taki zapis (np.: "g[oó]ra") wyszukiwania był możliwy, w opcjach programu musi być zaznaczona opcja "Włącz wyrażenia regularne w formułach". Z menu Narzędzia ---> Opcje ---> LibreOffice Calc ---> Oblicz, tam w grupie Symbole wieloznaczne w formułach należy mieć włączoną tą opcję.
W funkcji REGEX takie wyrażenia działają niezależnie od tego, czy ta opcja jest zaznaczona, czy też nie.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
MILESIU
Posty: 11
Rejestracja: wt lis 23, 2021 10:26 pm

Re: Wyrazenia regularne

Post autor: MILESIU »

A to akurat byla pierwsza rzecz jaka wlaczylem i nie zauwazylem zadnej roznicy, to teraz wiem do czego to bylo :)

Jednak apetyt rosnie w miare jedzenia :)

Jest jakas regula, zeby majac taka tabelke uzyskac taki wynik?

Kod: Zaznacz cały

  a   b  c  d           wynik
1 na  ma na da         na,ma,da
2 ma  ma da da         ma,da
3 na  ma da da         na,ma,da
czyli sume wyrazow bez powtorzen oddzielona jakims separatorem.
LibreOffice na Windows 10 Wersja: 6.4.3.2 (x64)
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Wyrazenia regularne

Post autor: Rafkus »

hmm... a jak sobie radzisz z makrami?
Jeśli dobrze to proponuję ten temat:Unikalne wystąpienia lub ten Usuwanie duplikatów z tekstu
A jeśli nie za dobrze to pozostają formuły macierzowe (zobacz pierwszy link) albo przy pomocy formuł pomocniczych zobacz to: Usuwanie duplikatów i puste komórki
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
MILESIU
Posty: 11
Rejestracja: wt lis 23, 2021 10:26 pm

Re: Wyrazenia regularne

Post autor: MILESIU »

Makra to juz jest level hard, w tej chwili nie mam czasu tego ogarnac, ale wyglada to tak interesujaco ze w przyszlosci na pewno do tego wroce, chocby dla rozrywki. Te funkcje tez wydaja sie przekombinowane, a ja mam 20 kolumn do tej operacji.


Znalazłem funkcje ZŁĄCZ.TEKST i juz pol sukcesu mam. Teraz tylko usunac z tego duplikaty oraz zdublowany separator. Mysle, ze moze jakos to regexem sie da w nowej kolumnie, bo mam wynik np "na|da|ma|na||||da" czyli wyciagnac z tego z parametrem g wystapienie [:alnum:] bo przewiduje cyfry i litery i oddzielic separatorem, a zdaje sie ze regex to umie tylko jeszcze nie wiem jak zapisac :)
LibreOffice na Windows 10 Wersja: 6.4.3.2 (x64)
Awatar użytkownika
Rafkus
Posty: 515
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Wyrazenia regularne

Post autor: Rafkus »

MILESIU pisze:Te funkcje tez wydaja sie przekombinowane, a ja mam 20 kolumn do tej operacji.
to popatrz jaką formułę teraz wymyśliłem:

Kod: Zaznacz cały

=POŁĄCZ.TEKSTY(",";1;JEŻELI(CZĘSTOŚĆ(PODAJ.POZYCJĘ($B2:$E2;$B2:$E2;0); WIERSZ($A$1:$A4)); TRANSPONUJ($B2:$E2); ""))
Formuła bardzo prosta :lol:, tak prosta że dla jasności będę ją wyjaśniał po kawałku :
A więc na początek funkcja POŁĄCZ.TEKSTY(",";1;ZAKRES) (funkcja ta jest dostępna tylko w LO)
- parametr pierwszy -","- wpisujesz jaki znak ma być separatorem,
- parametr drugi - 1 - oznacza, że mają być pominięte puste komórki,
- parametr trzeci - ZAKRES - jakiś zakres komórek, z których wartości mają być połączone w jeden tekst.

Teraz twoim ZAKRESEM mają być niepowtarzalne wartości z jakiegoś wiersza danych, uzyskuję go przy pomocy funkcji: JEŻELI(WARUNEK, TRANSPONUJ($B2:$E2); "") czyli JEŻELI jakiś WARUNEK jest spełniony (a konkretniej: czy dana wartość z kolejnych pozycji jest unikalna) to ma być przepisana wartość z PIONOWEGO zakresu danych w przeciwnym razie ma być podana pusta wartość "". A ma być z PIONOWEGO dlatego, gdyż funkcja z warunku zwraca tylko pionową macierz danych niezależnie od dostarczanych parametrów...

No to teraz WARUNEK, został on utworzony przy pomocy funkcji CZĘSTOŚĆ(DANE, KLASY). Ta funkcja pomaga podsumowywać zbiór jakiś DANYCH, np powiedzmy że w arkuszu masz zestawienie wyników z jakiegoś sprawdzianu. Dzięki tej jednej funkcji możesz dowiedzieć się ile osób dostało np ocenę <= 2, z przedziału 3÷4 a ile >=5, albo też wymienić ile osób dostało konkretną ocenę.
Wracając do twojego przypadku, ta funkcja jest przeznaczona dla liczb, dlatego zamienię twoje wartości tekstowe na informację: na której pozycji znajduje się pierwsze wystąpienie danego tekstu, czyli DANYMI będą wyniki funkcji: PODAJ.POZYCJĘ($B2:$E2;$B2:$E2;0)

Kod: Zaznacz cały

wiersz danych: na  ma na da został zastąpiony danymi: 1   2  1   4 
I teraz jeszcze musisz podać KLASĘ, czyli jakie wyniki cię interesują; chcesz poznać ile razy(*) została wymieniona każda pozycja z unikalną wartością: 1,2,3, ... itd - tyle kolejnych liczb ile pozycji miałeś w DANYCH. Kolejne numery dla KLASY otrzymasz przy pomocy funkcji KOLUMNA($A2:$E2)WIERSZ($A$1:$A4). WAŻNE zawsze od pierwszej kolumny Apierwszego wiersza.
Wyniki częstości dla tego przykładu to pionowy zakres danych mówiący ile razy wystąpiła dana liczba:

Kod: Zaznacz cały

1 --->   2
2 --->   1
3 --->   0
4 --->   1
  --->   0     ile było liczb większych od 4
(*)W funkcji JEŻELI tak naprawdę nie interesuje cię, ile została wymieniona jakaś pozycja tylko czy w ogóle wystąpiła. Przypadek gdy warunek jest liczbą większą od 0 jest traktowany jako PRAWDA, a zero to FAŁSZ

Mam nadzieję, że teraz to jasne...
EDIT:
Po zastanowieniu postanowiłem zamienić funkcję KOLUMNA() funkcją WIERSZ(). Myślę, że łatwiej zaznaczyć 4 czy też 100 wierszy, niż 4 czy też 100 kolumn. A propo: która to kolumna jest 100???

(odp: po sprawdzeniu CV)
Ostatnio zmieniony pt lis 26, 2021 12:15 pm przez Rafkus, łącznie zmieniany 1 raz.
Powód: Poprawa formuły
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
MILESIU
Posty: 11
Rejestracja: wt lis 23, 2021 10:26 pm

Re: Wyrazenia regularne

Post autor: MILESIU »

Dzieki, problem w calosci rozwiazany :D
LibreOffice na Windows 10 Wersja: 6.4.3.2 (x64)
ODPOWIEDZ