Odstranění duplicitních slov

V návaznosti na Odstranění duplicitních výrobců v názvu přidáváme tip na rychlé odstranění duplicitních slov.

Problém:

V elementu máme dvě slova za sebou, potřebujeme je odstranit. U jednotlivých produktů jde o různá slova. Jak postupovat?
Příklady:

  • Hrnek science science medicine
  • Hrnek Astronomy 3D 3D
  • Tričko s krátkým rukávem dámské dámské, velikost L

Princip je stejný, jako u odstranění duplicitních výrobců:

  • použije se pravidlo typu Najít a nahradit
  • zatrhneme, že budeme hledat jako “Regulární výraz”
  • využijeme tzv. referenci, kterou jsme popsali v příspěvku o odstranění duplicitních výrobců

V pravidle, v poli Najít, použijeme následující regulární výraz:

\b(\w+)\s+\1\b

Poznámka:

  • \b určuje hranice slov a výhody této regulární značky jsou zmíněny v příspěvku Odstranění velikostí z názvu produktu. Zde ji musíme použít, aby nám regulární výraz fungoval pro samostatná slova.
  • \s+ představuje jednu nebo více mezer v textu (nejen mezery, ale všechny “bílé” znaky, jako třeba tabulátory, apod.)

Do pole Nahradit uvedeme opět pomocí reference jen tu první část, kterou chceme zachovat:
\1

Ukázka pravidla:

Ukázka, jakému textu regulární výraz vyhovuje:

1 Like

Ahoj, ale co když je tam těch slov přebytečných více?
Na vstupu v productname - Korda tričko Kore Digital Camo TK Black T-Shirt Korda tričko Kore Digital Camo TK Black T-Shirt vel. XXXL (KCL268)

a do výstupu bych potřebovala dostat jen: Korda tričko Kore Digital Camo TK Black T-Shirt vel. XXXL (KCL268)

Nevím si rady :-/ Díky za pomoc

1 Like

Více slov za sebou, ktreré se potom vyskytují v textu znovu lze také snadno odstranit, regulární výraz by byl například: \b(.+)\s*\1\b

Ukázka:

3 Likes

Bohužel mi to tu duplicitu nenajde :-/ mohl byste se podívat do eshopu, jak si s tím poradit? :-/ mám napsat na podporu? anebo sem?

ideálně na náš support, viz Kontakt na naše specialisty | Mergado.cz

Pokud by se někomu hodilo, dávám sem ještě možné vylepšení regulárního výrazu:

\b(.{5,})\s*\1\b

Vylepšení spočívá v tom, že se budou hledat jenom duplicitní texty dlouhé 5 a více znaků. Tohle se může hodit v případě, že máte v textu třeba rozměry, velikosti apod. kdy by se mohly z milimetrů (mm) stát metry (m) a to by nemuselo být ku prospěchu. Proto se tyto krátké texty nebdou brát v potaz. :nerd_face:

Ukázka jak tento vylepšený regulární výraz funguje:

Ještě se nabízí varianta pro odstranění duplicit, které nejsou hned těsně za sebou, ale mezi opakujícím se textem je nějaký jiný text.

Potom by se mohl hodit regulární výraz: (.{5,})(.+\s)?\1\b
Nahradíme jej za: \1\2

Ukázka:

:exclamation: nezapomeňte vždy výsledek po odstranění duplicit zkontrolovat, zda nedochází i k nežádoucímu nahrazení textu. Pokud by se tak stalo, je třeba regulární výraz upravit, případně upravit samotný text nebo problematické produkty vyloučit z výběru, na který aplikujete pravidlo pro odstranění duplicit.

Ahoj Luďku, bohužel mi tyto regulární výrazy na můj text nefungují :frowning:
Mám třeba takový - Alien Baits umělá kukuřice neutrální Alien Baits umělá kukuřice neutrální Fluoro Pink (růžová) (AB011)
a potřebovala bych z toho dostat jen: Alien Baits umělá kukuřice neutrální Fluoro Pink (růžová) (AB011) - element manufacturer mám naplněn

Děkuji moc za pomoc!

Ta první Luďkova varianta (opakující se text je za sebou) také nefunguje?

\b(.{5,})\s*\1\b(.+)

->
\1\2

1 Like

vypadá to dobře :slight_smile: jdu zkusit - moc děkuji

1 Like

Ahoj Jirko, tak jsem to vyzkoušela v pravidlu, ale nevím, zda něco nedělám špatně, ale nechová se mi to v tom pravidle dobře…

Nechá mi to např. u tohoto produktu Korda atraktor Goo Korda atraktor Goo Moonshine Supreme (KGOO44) mi to nechá jen slovo Korda

Ukázkové pravidlo počítá pouze s delšími slovy pěti znaků a reference pro nahradit by měla obsahovat \ místo $. Na Váš příklady by měl fungovat následující výraz.

Najít: (.+)(.+\s)?\1\b
Nahradit: \1\2

5 Likes

Moc děkuji, zatím to vypadá, že funguje - zjišťuji tedy další produkty, kde mi tento výraz bohužel smaže gramáž
Garda Broky Carp Shots Camou Garda Broky Carp Shots Camou Green 0,9 g/20 ks (GAR1403)
Garda Broky Carp Shots Camou Green 0,9 /20 ks (GAR1403)

Ano, protože to regulárnímu výrazu vyhovuje… Já bych se doporučil vrátit k tomu podle mě nejvíc univerzálnímu regulárnímu výrazu, který v tomto vlákně najdete a to byl tento:

Potom by se mohl hodit regulární výraz: (.{5,})(.+\s)?\1\b
Nahradíme jej za: \1\2

Protože s ním vše funguje jak má a odstraňuje se jenom to, co se má odstranit, viz ukázka zde nebo screenshot:

Zdravím, aké riešenie by ste mi odporučili na tento špecifický problém:
Mám duplicitné názvy v productname viz. príklad:
Tu sa mi duplicity podarili odstrániť
*Foto1

Potom som dalším pravidlom odstránil aj tento typ duplicít(nakolko prvým pravidlom to na tieto nefungovalo):
*Foto2

Ale zároveň to odstránilo aj 3x za sebou vyskytujúce sa slovo ktoré je potrebné nakolko označuje rozmer:
*Foto3

A zároveň to robí problém aj pri názvoch ako sú tieto ( 2 rozmery rovnaké a tretí rozmer je iný):
*Foto4

Našlo by sa nejaké riešenie ? ďakujem

Zkuste do pravidla Najít a nahradit (se zatrženým hledáním jako regulární výraz) zadat do pole:

  • Najít: (.{5,})\s*\1
  • Nahradit: \1

Zdá se, že to funguje pro všechny popsané příklady, viz ukázka: regex101: build, test, and debug regex nebo screen:

Pozn.: pro jistotu, aby se nenahradilo něco nežádoucího, můžete pravidlo aplikovat na výběr produktů, který bude obsahovat jen produkty co mají takovéto duplicity, tj, pro podmínku výběru použijete např.:
[PRODUCTNAME] ~ "(.{5,})\s*\1"