Word – symbole wieloznaczne (wyrażenia regularne)

Jeśli miałeś do czynienia z programowaniem, lub administracją systemem operacyjnym Linux to zapewne spotkałeś się z terminem wyrażenia regularne. I mam tutaj pewną dobrą wiadomość: w Wordzie w narzędziu znajdź i zastąp została zaimplementowana namiastka wyrażeń regularnych.

Czym są owe wyrażenia regularne? Ogólnie mówiąc jest to pewien wzorzec tekstu o okreśonej strukturze, który będziemy chcieli zastąpić innym ciągiem znaków (lub pustym ciągiem znaków, czyli będziemy chcieli go usunąć).

Do czego nam się to może przydać? Jeśli obrabiasz jakieś obszerne dokumenty, w których wielokrotnie znajdują się pewne dość podobne ale nie identyczne ciągi znaków i robisz to ręcznie/półautomatycznie, to za pomocą wyrażeń regularnych możesz to zautomatyzować.

Usunięcie z tekstu wszystkich ciągów znaków Patrz rysunek X

Przykładowo załóżmy, że przeprowadzasz korektę pewnej książki. W treści książki wielokrotnie znajduje się sformułowanie Patrz rysunek X (gdzie X to liczba, czyli numer rysunku). Załóżmy, że chcemy z całego dokumentu usunąć to sformułowanie. Problemem jest owy X, czyli fakt że za każdym razem w tekście zmienia się numer rysunku. I tutaj właśnie wchodzą ubrane całe na biało wyrażenia regularne.

Dla przećwiczenia zagadnienia wpisz w nowym dokumencie np. taki tekst:

Patrz rysunek 10
Patrz rysunek 17
Siała baba mak
Patrz rysunek 50
Patrz rysunek 5
Siała baba mak

Następnie naciśnij kombinację klawiszy Ctrl + H (pojawi się okno dialogowe Znajdowanie i zastępowanie). Następnie kliknij w znajdujący się w lewym dolnym rogu okna przycisk Więcej (który zmieni swoją nazwę na Mniej) aby rozwinąć dodatkowe opcje. Zaptaszkuj pole Użyj symboli wieloznacznych (ponieważ miałem styczność z programowaniem, będę używał terminu wyrażenia regularne a nie symbole wieloznaczne).

W polu Znajdź wpisałem takie oto wyrażenie: Patrz rysunek [0-9]{1;3} W polu Zamień na zostawiłem puste pole (czyli zamień na pusty ciąg znaków, ale równie dobrze mógłbym wpisać np. słowo ocenzurowano – wtedy każde wyrażenie patrz rysunek X zostałoby zamienione na słowo ocenzurowano). Kliknij w przycisk Zamień wszystko, aby zobaczyć efekt naszej zamiany.

Teraz małe wyjaśnienie. Patrz rysunek jest to tekst, jaki znajduje się w dokumencie. Potem jest spacja a następnie [0-9] co oznacza dowolna wartość ze zbioru 0,1,2,3,4,5,6,7,8,9 czyli że może się znajdować dowolna cyfra. Jeśli by było [0-5] to wtedy byłyby wyszukiwane tylko te cyfry które są w zakresie od 0 do 5. Na końcu dodałem jeszcze {1;3} co oznacza, że wyrażenie w nawiasie kwadratowym może zawierać się od 1 do 3 razy (czyli do wzorca pasują wszystkie ciągi znaków: 0..9, 00..99, 000..999 czyli wszystkie liczby maksymalnie trzycyfrowe). Jeśli nie byłoby {1;3} to nasze wyrażenie regularne usunęłoby tylko jednocyfrowe numery rysunków, ba w tym wypadku wyrażenie regularne by zrobiło psikusa bo trafiając na ciąg znaków Patrz rysunek 50 usunęłoby ciąg znaków Patrz rysunek 5 zostawiając nam samo zero (drugą cyfrę). Jeszcze jedno słowo odnośnie naszej liczby wystąpień: zwróć uwagę, że w nawiasach wąsatych (klamrowych) liczbę 1 od liczby 3 oddziela znak średnika a nie przecinka!

Usunięcie wszystkich numerów PESEL

Załóżmy, że chcemy zanonimizować dokument. W tekście znajdują się imiona i nazwiska osób, oraz ich numery PESEL. Jak dobrze wiemy numer PESEL składa się zawsze z dokładnie 11 cyfr. Aby usunąć numery PESEL należy w polu znajdź wpisać następujące wyrażenie regularne:

[0-9]{11}

Chyba nie ma tutaj wielkiego zaskoczenia. Tym razem w nawiasie wąsatym wpisaliśmy nie przedział a dokładną liczbę wystąpień cyfr.

Usunięcie wszystkich liczb (całkowitych)

Znak za nawiasem kwadratowym * oznacza zero lub więcej wystąpień. Tak więc jeśli chcesz usunąć z dokumentu wszystkie liczby to można wpisać następujące wyrażenie regularne:

[0-9]*

Usunięcie wszystkich kodów towaru o różnej długości zaczynających się od PL a kończących się na literę X

Wpisz przykładowe dane:

PL123344X
DE12345X
PL343434X
PL55555555X

Następnie w polu znajdź wpisz PL*X

Usunięcie wszystkich numerów dowodów osobistych

Numer dowodu osobistego ma następujący format: trzy litery a potem sześć cyfr. Nasze wyrażenie będzie miało następującą postać:

[A-Z]{3}[0-9]{6}

Usunięcie wszystkich kodów pocztowych

Wpisz do dokumentu następujące dane:

35-001 Rzeszów
Telefon: 500-501-502
38-480 Krosno
Telefon: 502-503-504

Chcemy z treści usunąć wszystkie kody pocztowe. Prosta sprawa kod pocztowy ma format: dwie cyfry minus trzy cyfry. Więc nasze wyrażenie regularne ma postać:

[0-9]{2}-[0-9]{3}

Ale tutaj pojawiła się niespodzianka, bo nasz tekst po zamianie ma następującą postać:

Rzeszów

Telefon: 5-502

 Krosno

Telefon: 5-504

Po prostu fragment numeru telefonu pasuje do naszego wzorca kodu pocztowego. Stąd ten psikus. Ale można Wordowi powiedzieć, że nasz wzorzec musi być „samodzielnym wyrazem” a nie podciągiem dowolnego ciągu znaków. Aby poprawnie wykonać to ćwiczenie należy użyć następującego wyrażenia regularnego:

<[0-9]{2}-[0-9]{3}>

Znak < oznacza, że nasz wzorzec musi być początkiem wyrazu, czyli musi być np. w nowej linii lub poprzedzony tabulatorem, spacją, znakiem interpunkcyjnym. Znak > oznacza, że bezpośrednio na końcu naszego wzorca nie może być innych znaków (poza oczywiście spacją, tabulatorem, enterem czy znakiem interpunkcyjnym). Dzięki temu Word w ciągu znaków: 0000-0000 nie znajdzie podciągu 00-000, który pasuje do wzorca kodu pocztowego. Tak samo w poprzednich przykładach (usuwanie numerów pesel, usuwanie numerów dowodów osobistych) można nasze wyrażenie regularne opakować w nawiasy trójkątne.

Wyławianie tytułów rozdziałów ze spisu treści

Ostatnio potrzebowałem wrzucić na stronę internetową spis treści swojej książki (i to mnie zainspirowało do napisania tego wpisu na blogu). Tak więc z pliku PDF skopiowałem spis treści do Worda. Miał on następującą postać

Rozdzial1..................5
Rozdzial2..................11
Rozdzial3..................12

(skopiuj powyższy tekst do Worda, gdyż wpisując ręcznie kropki w Wordzie mechanizm autokorekty może zastąpić 3 kropki symbolem wielokropka).

Chciałem zostawić same tytuły rozdziałów natomiast kropki i numery stron chciałem usunąć. Mógłbym zrobić to ręcznie, ale spis treści miał około 100 pozycji. Usunięcie wszystkich kropek nie rozwiązuje problemu, gdyż wtedy na końcu każdego wiersza za tytułem rozdziału zostałyby numery stron. I tutaj znów z pomocą przychodzą wyrażenia regularne. Otóż w polu znajdź można wpisać:

.*[0-9]{1;3}

Jeśli książka miałaby więcej niż 999 stron, to oczywiście końcówkę wyrażenia należałoby zmienić na {1;4}

Wyławianie grup

Wpisz kilka przykładowych numerów dowodów osobistych np.

ABC123456
GHJ
CDE987654
XYZ456789

Następnie chcę ten tekst zmienić tak, aby przed serią dowodu osobistego (trzy litery) pojawił się ciąg znaków numer serii a przed 6 cyframi pojawił się ciąg znaków numer dowodu.

W polu znajdź wpisz: ([A-Z]{3})([0-9]{6}) a w polu zamień na wpisz: Seria dowodu: \1, numer dowodu: \2

W wyniku otrzymamy coś takiego:

Seria dowodu: ABC, numer dowodu: 123456
GHJ
Seria dowodu: CDE, numer dowodu: 987654
Seria dowodu: XYZ, numer dowodu: 456789

Jeśli seria naszego dowodu osobistego nie zawsze jest pisana dużymi literami to możemy w polu znajdź wpisać nieco zmienione wyrażenie regularne: ([A-Za-z]{3})([0-9]{6})

W naszym wyrażeniu regularnym mamy zdefiniowane dwie grupy. Grupą jest wzorzec otoczony nawiasami okrągłymi. Pierwsza grupa to ciąg 3 dużych liter, druga grupa to ciąg 6 cyfr. Jeśli w polu Zamień na znajduje się wyrażenie \1 oznacza to, że w tym miejscu ma się pojawić dopasowanie z wzorca z pierwszej grupy, analogicznie \2 oznacza dopasowanie do wzorca z drugiej grupy.

Wróćmy do przykładu z naszym rysunkiem. W tekście znajdują się ciągi znaków: Patrz rysunek X (gdzie X to jakaś liczba). Jeśli chcemy, aby zostało to zastąpione ciągiem znaków Rysunek X ilustruje omawiane zagadnienie możemy w polu znajdź wpisać: Patrz rysunek ([0-9]{1;3}) a w polu zamień na: Rysunek \1 ilustruje omawiane zagadnienie.

Oczywiście ten artykuł nie wyczerpuje wszystkich możliwości owego narzędzia. Zachęcam do samodzielnego eksperymentowania, gdyż jest to najlepsza forma nauki.

Jeśli artykuł Ci się podobał, będę wdzięczny gdy go udostępnisz w mediach społecznościowych
Ten wpis został opublikowany w kategorii sztuczki i oznaczony tagami , . Dodaj zakładkę do bezpośredniego odnośnika.

6 odpowiedzi na Word – symbole wieloznaczne (wyrażenia regularne)

  1. Krzywoj pisze:

    Od dłuższego czasu próbuję usunąć z całego dokumentu wpis: Letter 332,4897. Z tym, ż czasem występuje od 1 do 4 cyfr przed przecinkiem i po przecinku. Próbowałem wykorzystać na różne sposoby twój pomysł z kodami pocztowymi, niestety nie udało mi się. Czy miałbyś pomysł na to? Podziękowanie za bardzo przydatny wpis i ogólnie blog

    • Damian Daszkiewicz pisze:

      Ku potomności:

      W wordzie wpisałem taki tekst:

      Xxxx Letter 332,4897 xxxxx
      Xxxx Letter 332,4897 xxxxx
      Xxxx Letter 332,487 xxxxx
      Xxxx Letter 332,48 xxxxx

      W polu szukaj wpisałem: (zwróć uwagę na przecinek pomiędzy tymi dwiema grupami cyfr). Nie zapomnij zaznaczyć opcji użyj symboli wieloznacznych.

      Letter [0-9]{1;4},[0-9]{1;4}

  2. Krzywoj pisze:

    Sory popełniłem błąd w przykładzie. Powinno być Letter 332, 4897.
    Bez spacji po przecinku to wcześniej, dzięki twemu wpisowi dałem radę.

  3. Art pisze:

    A w jaki sposób można się pozbyć z dokumentu takich elementów jak [2] [10] [100] ?

    • Damian Daszkiewicz pisze:

      Wymyśliłem coś takiego:
      [[][0-9]{1;3}[]]

      Najpierw mam otwierający kwadratowy nawias wewnątrz kwadratowych nawiasów (dopuszczalny zestaw znaków) potem wyrażenie [0-9]{1;3} oznaczające 1-3 cyfrową liczbę i na końcu kwadratowy nawias zamykający wewnątrz kwadratowych nawiasów

  4. Art pisze:

    Dzięki, działa.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.