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.
jó lenne egyszerűen bővíteni az input filtereket.
Lehet ,hogy egyszerűbb írni egy nem regexes függvényt és azt pluszban meghívni.
eutlantis
Értsd: kéne az a regex, aminek a hiánya miatt átcsúszott a szemét. Igen meg kell írni, de a kérdés nem az, h közben ki kell-e fújni az orrunkat, hanem, h mi az a regex.
Ez jutott eszembe: https://www.youtube.com/watch?v=Ct-lOOUqmyY
Gábriel Ákos
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."
Asszem félre, igen. Nem azt akarom megtudni, mire nem meccsel, hanem h mi az a legszigorúbb regex, amire a maradék meccsel. Kolléga az előző kommentben jól érezte, hogy a hibát kell megtalálni.
Indulásként esetleg nézd meg ezt. Elég sok példa van.
(libregexp-assemble-perl csomag része.)
Van ilyen tool!
Úgy hívják awk és program, amit meg kell írni.
A problémád tipikus addattisztítási feladat:
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. ;)
Igen, tisztogatás, de a szemrevételezés az munkás.
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.
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
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...
Levenshtein distance?
eutlantis
ez is lehet 1 metric
Ez a Hamming távolság új neve?
Nem. Egyébként a Levenshtein elég lassú.
https://en.wikipedia.org/wiki/Edit_distance
eutlantis
Esetleg építeni egy Aho-Corasickot építeni valamilyen random módon kiválasztott mintára majd azt redukálni regexppé.
Más miatt, de érdekes
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/
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
az előbbi jópofa, köszi
Hahh, ez marhajó, köszi!
Talán ez volt az:
https://ibnuhx.com/regex-generator/
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
Köszi ezeket. Pont a minap futottam bele én is egy ilyesmibe: https://github.com/pemistahl/grex