PDA

View Full Version : ESPRESSIONI REGOLARI - info


sharkkk
12-01-2015, 19:32
Sto cercando di estrapolare dei dati tramite query in un database "speciale" e per filtrare i dati devo per forza usare delle espressioni regolari.

Se voglio cercare Roma attualmente con (\\W|^)Rome(\\W|$) mi trova cose come: Basilica_dei_Santi_Apostoli_(Rome), Egeria_(Rome), ..., e poi finalmente Rome.

Il problema è che mi trova molte cose che non voglio come Basilica_dei_Santi_Apostoli_(Rome) e mi trova Rome al 200esimo posto, mentre Basilica è il primo risultato.

Come posso fare per trovare Rome per primo tramite espressione regolare?

wingman87
12-01-2015, 21:01
Concettualmente mi sembra sbagliato quello che vuoi fare. Vorresti ordinare i risultati della ricerca ma lo vuoi fare con un linguaggio fatto per filtrare. Ordinare != Filtrare
Non puoi post-processare i risultati ordinandoli ad esempio per lunghezza?
Oppure il metodo che usi per interrogare questo database "speciale" non offre qualcosa per specificare in qualche modo l'ordinamento?

sharkkk
12-01-2015, 21:19
Concettualmente mi sembra sbagliato quello che vuoi fare. Vorresti ordinare i risultati della ricerca ma lo vuoi fare con un linguaggio fatto per filtrare. Ordinare != Filtrare
Non puoi post-processare i risultati ordinandoli ad esempio per lunghezza?
Oppure il metodo che usi per interrogare questo database "speciale" non offre qualcosa per specificare in qualche modo l'ordinamento?

è un 3store, sul quale vengono fatte query SPARQL del tipo:
SELECT DISTINCT *
FROM <http://dbpedia.org>
where {
[] foaf:isPrimaryTopicOf ?wikiID.
FILTER (regex(?wikiID, "(\W|^)''' + AJAX_data + '''(\W|$)")) .
}
ORDER BY ?wikiID
limit 50

in questo caso specifico vengono presi tutti gli uri di wikipedia che contengono all'interno la stringa cercata (AJAX_data).
Pero se cercassi Roma, troverei non solo l'uri di wikipedia di Roma, ma tutti quelli che hanno all'interno la parola Roma, e Roma stessa sarebbe presente dopo tanti risultati.

wingman87
13-01-2015, 08:13
Molto interessante questo progetto! Comunque riguardo alla tua domanda: non puoi modificare il resto della query? Solo la regex?

sottovento
13-01-2015, 10:33
Sto cercando di estrapolare dei dati tramite query in un database "speciale" e per filtrare i dati devo per forza usare delle espressioni regolari.

Se voglio cercare Roma attualmente con (\\W|^)Rome(\\W|$) mi trova cose come: Basilica_dei_Santi_Apostoli_(Rome), Egeria_(Rome), ..., e poi finalmente Rome.

Il problema è che mi trova molte cose che non voglio come Basilica_dei_Santi_Apostoli_(Rome) e mi trova Rome al 200esimo posto, mentre Basilica è il primo risultato.

Come posso fare per trovare Rome per primo tramite espressione regolare?
Hai provato a rimuovere ^ e $ dall'espressione regolare, i.e.
\\WRome\\W ?

Daniels118
13-01-2015, 14:55
Non conosco questo particolare linguaggio, ma l'espressione "\W" mi suggerisce qualcosa come "word", nel senso di parola intera. I caratteri ^ e $ vengono generalmente utilizzati per indicare l'inizio e fine di una stringa.
Io proverei "^Rome$".

sottovento
13-01-2015, 15:21
Non conosco questo particolare linguaggio, ma l'espressione "\W" mi suggerisce qualcosa come "word", nel senso di parola intera. I caratteri ^ e $ vengono generalmente utilizzati per indicare l'inizio e fine di una stringa.
Io proverei "^Rome$".
Veramente e' il contrario: \W indica ogni carattere che NON appartiene ad una parola. Quello che ti suggerisce "word" e' \w

Daniels118
13-01-2015, 15:38
Quindi si dovrebbe leggere: qualunque carattere che non appartiene ad una parola, seguito da "Rome", seguito da qualunque carattere che non appartiene ad una parola.
Da cui le corrispondenze con sequenze come "Egeria_(Rome)", mentre per la corrispondenza esatta ci pensano |^ e |$.
Quindi perché "\\WRome\\W" dovrebbe selezionare solo "Rome"? Mi sembrava che la richiesta fosse proprio quella di trovare solo la corrispondenza esatta, o sbaglio?

wingman87
13-01-2015, 17:34
Non conosco questo particolare linguaggio, ma l'espressione "\W" mi suggerisce qualcosa come "word", nel senso di parola intera. I caratteri ^ e $ vengono generalmente utilizzati per indicare l'inizio e fine di una stringa.


Io proverei "^Rome$".



Sì se vuole solo una corrispondenza esatta sarebbe giusto così, io ho dato per scontato che volesse mantenere tutte le corrispondenze.

sottovento
14-01-2015, 04:35
Sì se vuole solo una corrispondenza esatta sarebbe giusto così, io ho dato per scontato che volesse mantenere tutte le corrispondenze.

Beh, se vuole la corrispondenza esatta basterebbe

Pattern p = Pattern.compile("Rome");
Matcher m = p.matcher(<la stringa da verificare>);
boolean result = Matcher.matches()


quindi senza nemmeno ^ e $

Sospetto che voglia qualcosa di diverso, che magari non e' stato specificato per brevita'

wingman87
14-01-2015, 05:41
Non mi sembra, se non metti ^ e $ il match può avvenire in qualunque punto della stringa. Per esempio troverebbe anche Romeo

Daniels118
14-01-2015, 07:38
Nel caso di più risultati, se si potesse mettere una funzione nella clausola order by - per esempio strlen - si potrebbe ottenere un ordinamento conveniente.

sottovento
14-01-2015, 09:38
Non mi sembra, se non metti ^ e $ il match può avvenire in qualunque punto della stringa. Per esempio troverebbe anche Romeo
No, il matches() e' sull'intera stringa

wingman87
14-01-2015, 11:24
No, il matches() e' sull'intera stringa

Hai ragione, però non credo che nella query faccia il matching in quel modo altrimenti \WRome\W non farebbe il match con "Basilica_dei_Santi_Apostoli_(Rome)"

sottovento
15-01-2015, 04:36
Hai ragione, però non credo che nella query faccia il matching in quel modo altrimenti \WRome\W non farebbe il match con "Basilica_dei_Santi_Apostoli_(Rome)"

A meno che non stia usando una libreria dedicata, immagino che davvero stia facendo il matching usando il Matcher, probabilmente utilizzando il grouping.
Sono d'accordo con te che non sta utilizzando il metodo matches() ma se il suo scopo e' quello di trovare il match esatto lo potrebbe fare, visto che ce l'ha a disposizione