Regex pattern kitalálóka

Fórumok

Párszor már beleakadtam ebbe a problémába, de most nagyon jó lenne 1 ilyen tool: Van 1 csomó string-em, amire meg kéne találni azt a regex pattern-t ami a lehető legszigorúbb és minden megadott stringre illeszkedik. Van erre kész megoldás, illetve hogy kéne nekiállni?

Igazából az a feladat, hogy:

  • a lista 1 része meccsel regex1-re,
  • a lista másik része meccsel regex2-re,
  • Kéne egy 3-ik regex, amire a maradék meccsel,
  • illetve a maradékból menyi az, amire regex3 mégsem meccsel.

Mondjuk úgy, hogy a nem well-formed stringeket kéne megtalálni és ez tényleg az a 2 legyen a nagyonsokból, amit biztosan javítani kell kézzel.

Ötlet, tipp, bármi?

Hozzászólások

Ennek a meghatározásnak így nincs értelme mert bármi két regexet vagy-al összekapcsolsz, az is regex.

Például: (a|b)

Definiáld mi az ami well-formed, arra tudsz kapni egy regexet.

Az, hogy "mennyire nem well-formed" a többi, az első körben érdektelen.

Gábriel Ákos

Pont az az érdekes, ami nem well-formed, azok a problémásak. És a kiveszem az összesből a jókat és a maradék az hiba, az se jó megközelítés, mert nem a problémára válaszol. Pl.
 

van 1 csomó regex-em, amivel inputot validálok,
rendszeresen átcsúsznak invalid tételek, amik később problémát okoznak,
jó lenne egyszerűen bővíteni az input filtereket.

Szerkesztve: 2021. 03. 23., k – 08:02

Kész megoldást nem tudok, de Javaban ez nem tűnik túl komplikáltnak.

Kell egy List<String> amin végigiterálsz és hívogatod a Stringeken a metódust ami végigpróbálja mindhárom Matcher -el, hogy matches() -e. Ha egyikre sem machel a String, akkor azt gyüjtöd egy másik listába.

Bővebben.

Feltéve, ha jól értettem meg azt, amit szeretnél.

Vagy bedobni az összes stringet egy szövegfájlba, aztán

sort fájl | uniq | grep -v regexp1 | grep -v regexp2 | grep -v regexp3 > javítandók

disclaimer: ha valamit beidéztem és alá írtam valamit, akkor a válaszom a beidézett szövegre vonatkozik és nem mindenféle más, random dolgokra.

Nem értem. A 3. regex, ami meccsel mindenre amire első kettő nem, az a teljes halmaz, kivéve az első kettő feltételeit. Ebben minden benne lesz, ami nem meccsel az első kettőre egyikére sem. Elméletileg nem lesz olyan, ami nem meccsel egyikre sem a háromból.

Vagy félreértek valamit...

"A megoldásra kell koncentrálni nem a problémára."

Van ilyen tool!

Úgy hívják awk és program, amit meg kell írni.

A problémád tipikus addattisztítási feladat:

  • kell egy minta, amire illeszkednek az 1. típusú rekordok
  • kell egy minta, amire illeszkednek az 2. típusú rekordok/a maradék
  • kell egy minta, amire illeszkednek az 3. típusú rekordok/a maradék
  • megnézzük mi maradt
    • utána esetleg újabb minta, vagy
    • javító algoritmus
  • loop, amíg el nem fogynak a rekordok vagy a hiba mennysége kellő mértékben csökken

Egyes esetekben lehet javító szótárat építeni. Pl.:

"well-formed"=Budapest ->szótárba (persze ilyen már van)

A megtalált hibák alapján kialakulhat egy szótár sor: Budapest,budappest,BudiPest,budoPest

Itt az első trükk a nagybetűsítés!!

A szótár sorokból készül egy regexp szótár (tömb). Ha az Input nagybetűsített elem megegyezik a szótár bármely elemével, akkor találat. Ilyenkor az erdeti inputot cseréljük a szótár sor fő elemére. Ha változott, akkor hiba++.

A maradék nincs a szótárban - pl. Csepel. ;) Szemrevételezés után csaphatjuk a javító szótárhoz: BUDAPEST=Budapest,budappest,BudiPest,budoPest,Csepel

Aztán loop.

Az élet nem oneliner. ;)

Van olyan program, ami kitalálja még a gondolatodat is. Csak most nem jut eszembe. ;)

A szemrevételezés nem az, hogy a maradék 10M rekordot megnézem. Elég néhány darabot, amiből újabb szabályt lehet lérehozni.

A való világ tud létrehozni érdekes eseteket is. Íme egy cím: Budapest Miskolc Wien, Kossuth utca 3. Erre mit lépne a MI?

A fent leírt módszerrel közel 100% pontossággal lehet javítani, bár nem tudom miben mesterkedsz.

Elég néhány darabot, amiből újabb szabályt lehet lérehozni.

 

Na látod pont ez a baj ezzel. Mert mi van, ha a maradék 10M tétel között van 7 különböző mintájú szemét, de 10M helyett legyen csak nx100, ugyanúgy elvész. Nehéz garantálni, hogy azt a maradék 7et megtalálom.

Erre idézem magam

loop, amíg el nem fogynak a rekordok vagy a hiba mennysége kellő mértékben csökken

Ha tényleg adattisztításról van szó, akkor bizony van egy határ, amikor már elfogynak a javítási lehetőségek. A megmaradt eseteket vissza kell dobni az adatforrásnak javításra. (adatpontosítás) Fel lehet mérni azt is, hogy a részlegesen javított adatok felhasználhatók-e.

További lehetőség az esetlegesen ellentmondó vagy hiányos adatok más algoritmussal végzett kiegészítése vagy kijavítása. De ehhez már tényleg tudni kellene mit csinálsz. A regexp is algoritmus, de tudni kell mit csinálsz.

Adott esetben az adatok keletkezésének folyamatát és forrását is érdemes ismerni. Persze néha előfordulhat az "adatbányászás a semmiből" konstelláció is. Ha ezeket fel lehet mérni, akkor akár vissza is dobható a feladat, mint reális költséggel megvalósíthatatlan. Ilyen munkát is láttam már...

Esetleg építeni egy Aho-Corasickot építeni valamilyen random módon kiválasztott mintára majd azt redukálni regexppé.

Szerkesztve: 2021. 03. 23., k – 12:56

Ezzel most nem nagyon fogsz tudni mit kezdeni, de van ilyen eszköz, kb az elmúlt fél évben jött szembe a neten. Már csak annyi kiegészítésként, hogy sem a szoftver nevére, sem az oldal címére nem emlékszem, de ha valahol elmentettem vagy beugrik, még jelentkezem. Valami regex teszter vagy hasonló, és pont az volt a leírás lényege, hogy legenerálja neked azt a mintát, ami pontosan a megadott elemekre fog meccselni.

Eddig ez lett:

https://regex-generator.olafneumann.org/

https://www.regexmagic.com/