Jak usunąć wszystkie zduplikowane słowa w każdym wierszu za pomocą Notepad ++?

11

Pracuję nad plikiem zawierającym wiersze ze słowami kluczowymi, a niektóre wiersze zawierają zduplikowane słowa kluczowe.

Na przykład:

dangerous,dangerous,hazardous,perilous

Chcę powiedzieć Notepad ++, że chcę usunąć każde zduplikowane słowo z wiersza. W tym przykładzie dangerous,zostałby usunięty:

dangerous,hazardous,perilous

Mam kilka takich linii i dlatego szukam zautomatyzowanego sposobu na zrobienie tego.

Gabriel
źródło
1
Co dangerous,hazardous,dangerous,perilous? Innymi słowy, czy zduplikowane słowa są zawsze obok siebie?
Daniel Beck

Odpowiedzi:

11

Możesz użyć wyrażenia regularnego, aby usunąć kolejne zduplikowane słowa w linii, jednak nie sądzę, że jest możliwe usunięcie zduplikowanych słów, które nie są kolejne (np dangerous, hazardous, dangerous.).

Użyj tego wyrażenia regularnego w oknie zastępowania w Notepad ++ i nie zapomnij wybrać „Wyrażenie regularne” jako opcji Tryb wyszukiwania poniżej:

Ten regex usunie wszystkie kolejne słowa duplikatów - czy to 2 zduplikowane słowa lub 10 zduplikowane słowa kolejno: \b(\w+)(?:,\s+\1\b)+ .

Dokładnie to samo wyrażenie regularne bez przecinków: \b(\w+)(?:\s+\1\b)+(może być przydatne dla innych użytkowników).

Jeśli chcesz regex specjalnie dla zaledwie dwóch zduplikowane słowa (podwójna), należy użyć tego wyrażenia regularnego: (\b\w+\b)\W+\1.

Umieść ten regex w Wymienić z pudełka, aby zachować jedno wystąpienie słowa (w przeciwnym razie wszystkie powtarzające się słowa będą usuwane) ${1} .

Te wyrażenia regularne naprawią sytuację taką jak opisana w pytaniu jako przykład. Pierwsze wyrażenie regularne będzie działać dla każdej liczby zduplikowanych słów (np. dangerous, dangerous, dangerous, dangerous, hazardous), Podczas gdy druga wersja będzie działać tylko dla dwóch zduplikowanych słów (np dangerous, dangerous, hazardous.).

Uwaga: Wyrażenie regularne będą miały zastosowanie tylko do formatu opisanego w pytaniu, co oznacza, że formaty podoba two words, two words, anotherword, two-words, two-words, anotherword, three words expression, three words expression, anotherwordnie ulegnie zmianie, ponieważ regex nie będzie stosować się do nich.

amiregelz
źródło
Dzięki za pomoc! Jednak otrzymuję 0 wystąpień, próbowałem zrobić to z oddzielnymi słowami kluczowymi, jak sugerowałeś, i to nie zadziałało, próbowałem również, jak były wcześniej i nic, proszę sprawdzić zrzut ekranu: goo.gl/eZ7Kp
Gabriel
Ten wyrażenie regularne powinno działać: (\b\w+\b)\W+\1dla dwóch zduplikowanych słów. Zmienię swoją odpowiedź. Przecinki powodują, że inne wyrażenia regularne nie działają.
amiregelz
Próbowałem każdej możliwej kombinacji, bez przecinków, tylko spacje, bez spacji i przecinków, a jednak nic. Proszę, oświeć mnie, oto plik tekstowy: goo.gl/sP20z
Gabriel
Problem polega na tym, że wyrażenie regularne napisałem w odpowiedzi odnosi się tylko do formatu (myślałem) prosiłeś: word, word, anotherword. Jednak masz wiele instancji, które są nieco inne, na przykład came across, came acrossniektóre z 3 lub 4 słowami. Są też słowa z 'podobnymi don'ti to komplikuje sprawę w systemie wyrażeń regularnych Notepad ++ . System wyrażeń regularnych Notepad ++ jest również dość irytujący i ograniczony, więc rozwiązaniem może być użycie wyrażenia regularnego w pythonie (lub innym języku) lub tworzenie wyrażeń regularnych specyficznych dla formatu dla Notepad ++.
amiregelz
Kolejny problem polega na tym, że większość zduplikowanych słów pojawia się również w poprzednim wierszu, co utrudnia osiągnięcie celu. Jeśli chcesz usunąć wszystkie zduplikowane słowa, nie było to takie trudne. Można zrobić coś jak ten i ten . Sugeruję, abyś używał określonych wyrażeń regularnych w Notepad ++ (mogę ci pomóc, po prostu powiedz mi wszystkie formaty zduplikowanych słów) lub rozważ inne podejście do twojego problemu.
amiregelz
1

Oto sposób na wykonanie zadania, to zastąpi wszystkie zduplikowane słowa, nawet jeśli nie są ciągłe:

  • Ctrl+H
  • Znajdź co: (?:^|\G)(\b\w+\b),?(?=.*\1)
  • Zamienić: LEAVE EMPTY
  • zaznacz opcję Zawiń się
  • zaznacz Wyrażenie regularne
  • NIE SPRAWDŹ . matches newline
  • Replace all

Wyjaśnienie:

(?:^|\G)    : non capture group, beginning of line or position of last match
(\b\w+\b)   : group 1, 1 or more word character (ie. [a-zA-Z0-9_]), surrounded by word boundaries
,?          : optional comma
(?=.*\1)    : positive lookahead, check if thhere is the same word (contained in group 1) somewhere after

Biorąc pod uwagę dane wejściowe takie jak: dangerous,dangerous,hazardous,perilous,dangerous,dangerous,hazardous,perilous

Mamy:

dangerous,hazardous,perilous
Toto
źródło