[risolto]espressioni regolari, ottenere una parte di stringa

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da UbuNuovo »

'.*' significa: qualsiasi serie di caratteri
"." un carattere qualsiasi
"*" ripetuto un qualsiasi numero di volte (0 o più volte).

ti ho fatto due esempi per farti vedere che puoi costruire $dopo in due modi:
modo 1)
dopo='.*/texture/dr.bmp'

in questo caso non inserisci '.*' nella riga di codice:
match=$( grep -oP "$prima\K(.*?)(?=/)(?=$dopo)" <(echo "$path") )

modo 2)
dopo='/texture/dr.bmp'
in questo caso inserisci '.*' nella riga di codice:
match=$( grep -oP "$prima\K(.*?)(?=/)(?=.*$dopo)" <(echo "$path") )

poi
la parte che rende sicuramente ungready il match è (.*?)(?=/)
in pratica viene presa la parte compresa da "$prima" fino alla prima barra (esclusi).
Salva l'Ucraina! 🇺🇦
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da melfnt »

sì, ma qui $dopo vale necessariamente "/.*"

Sapendo questo, riformulo la domanda:
sia MATCH il valore che verrà estrapolato dalla stringa e salvato nella variabile $match
L'espressione regolare, una volta risolti $prima e $dopo è questa: "/usr/share/MATCH/.*"

Ora, ci sono alcune stringhe tipo "/usr/share/misqui/texture/dr.bmp" per dirne una, che possono matchare l'espressione regolare in due modi:

il punto asterisco è rosso, il MATCH è verde
modo [1] /usr/share/misqui/texture/dr.bmp
modo [2] /usr/share/misqui/texture/dr.bmp

Domanda: è sufficiente che nell'espressione regolare di grep compaia (?=/) per far sì che a MATCH venga associata la più corta stringa che soddisfa l'espressione regolare (e che quindi la stringa venga interpretata col modo [1] ), oppure alcune stringhe potrebbero anche essere interpretate usando il modo [2], cosa che farebbe non funzionare il programma?

;)
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da UbuNuovo »

Forse sono io, ho il mal di testa... ma non ci capiamo granché :D

modo 1 e 2 devono dare lo stesso risultato!
Sono solo modi diversi di scrivere la stessa cosa!
Che ".*" arrivi dalla variabile o sia scritto nel codice non cambia nulla, usa la versione che ti resta più comoda.


metodo senza ".*" in $dopo (con '.*' nel codice)

Codice: Seleziona tutto

8-) path="/usr/share/misqui/texture/dr.bmp"
8-) prima='/usr/share/'
8-) dopo='/texture/dr.bmp'
8-) match=$( grep -oP "$prima\K(.*?)(?=/)(?=.*$dopo)" <(echo "$path") )
8-) echo "$match"
misqui
metodo con ".*" in $dopo (quindi non nel codice)

Codice: Seleziona tutto

8-) path="/usr/share/misqui/texture/dr.bmp"
8-) prima='/usr/share/'
8-) dopo='.*/texture/dr.bmp'
8-) match=$( grep -oP "$prima\K(.*?)(?=/)(?=$dopo)" <(echo "$path") )
8-) echo "$match"
misqui
i due metodi con $dopo che rappresenti qualsiasi path

metodo con ".*" in $dopo (quindi non nel codice)

Codice: Seleziona tutto

8-) dopo='.*/.*'
8-) match=$( grep -oP "$prima\K(.*?)(?=/)(?=$dopo)" <(echo "$path") )
8-) echo "$match"
misqui
metodo senza ".*" in $dopo (con '.*' nel codice)

Codice: Seleziona tutto

8-) dopo='/.*'
8-) match=$( grep -oP "$prima\K(.*?)(?=/)(?=.*$dopo)" <(echo "$path") )
8-) echo "$match"
misqui
Domanda: è sufficiente che nell'espressione regolare di grep compaia (?=/) per far sì che a MATCH venga associata la più corta stringa che soddisfa l'espressione regolare.
Si
Salva l'Ucraina! 🇺🇦
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da melfnt »

Non ci capiamo perché tu pensi che $dopo posso costruirmelo io in funzione della stringa da esaminare, in realtà non è così:
qui $dopo vale necessariamente "/.*"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
QUESTO È IMPORTANTE E IMPRESCINDIBILE
ovvero: non posso mettere /texture/dr.bmp né qualsiasi altro valore che non sia "/.*" in $dopo.
D'accordo?

Il mio dubbio deriva dal fatto che essendoci due "asterischi", alcune stringhe possono soddisfare l'espressione regolare in tanti modi.

modo [1] e [2] sono i modi in cui la stringa può matchare l'espressione regolare, e sono differenti banalmente perché in uno mi ritrovo "misqui" dentro $match (e mi ve bene) nell'altro mi ritrovo "misqui/texture" e non mi va bene.

Se, come penso di aver capito, il frammento di espressione regolare (?=$dopo) che viene risolto in (?=/.*) fa sì che dentro match venga salvata la più corta stringa di caratteri compresa fra $prima e $dopo, il mio programma funziona così, altrimenti dovrei modificarlo in modo da prendere $prima e $dopo il più lunghi possibili.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da UbuNuovo »

melfnt [url=http://forum.ubuntu-it.org/viewtopic.php?p=4608270#p4608270][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:modo [1] e [2] sono i modi in cui la stringa può matchare l'espressione regolare, e sono differenti banalmente perché in uno mi ritrovo "misqui" dentro $match (e mi ve bene) nell'altro mi ritrovo "misqui/texture" e non mi va bene.
Se guardi gli esempi che ho fatto il risultato, usando modo1 o 2, non cambia; ottengo sempre e solo "misqui" mai "misqui/texture".
Salva l'Ucraina! 🇺🇦
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da melfnt »

Se guardi gli esempi che ho fatto il risultato, usando modo1 o 2, non cambia; ottengo sempre e solo "misqui" mai "misqui/texture".
modo 1 o modo 2 non è che si "usano", sono solo due interpretazioni diverse per matchare la stessa espressione regolare.
"/usr/share/MATCH/.*" può essere matchata in due modi (detti modo [1] e [2]) da "/usr/share/misqui/texture/dr.bmp", ti torna?

Vorrei avere la garanzia che grep interpreti la RE sempre nel solito modo: sostituendo MATCH con la stringa più corta e .* con quella più lunga.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da UbuNuovo »

modo 1 e 2 formano la stessa identica linea di codice, prova a sostituire il valore delle variabili nelle righe 'match=...'.
Salva l'Ucraina! 🇺🇦
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da melfnt »

Abbi pazienza, stavolta sono io che non capisco.
:D

Abbiamo una linea di codice (dopo aver risolto $prima e $dopo):

Codice: Seleziona tutto

match=$( grep -oP "/usr/share/\K(.*?)(?=/.*)" <(echo "$path") )
Nella quale cui compare un'espressione regolare, della quale evidenzio due parti:

in verde ciò che successivamente verrà salvato dentro $match
in rosso il .*
e che quindi riscrivo così: "/usr/share/\K(.*?)(?=/.*)"

(1) Fin qui ti torna?

Bene, a questo punto proviamo a far matchare la stringa "/usr/share/misqui/texture/dr.bmp" con l'espressione regolare di cui sopra:

domanda: (2) come si comporta grep?
ovvero: quale parte della stringa associa al verde e quale al rosso?
Perché secondo me ci sono due modi:

modo [1]: /usr/share/misqui/texture/dr.bmp
modo [2]: /usr/share/misqui/texture/dr.bmp

che sono due interpretazioni ugualmente plausibili per la stessa espressione regolare, (3) ti torna?
Intendo, entrambe fanno matchare la stringa con l'espressione regolare, senza dover cambiare il codice.

Rispondi punto per punto, per favore.
;)
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da UbuNuovo »

mi arrendo! :ciao:
Salva l'Ucraina! 🇺🇦
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da melfnt »

Dai, per favore!

ti do tre buoni motivi:
1) è vero che non sono molto chiaro quando mi esprimo, però se fate così non imparerò mai a spiegarmi
2) magari sei tu che hai frainteso, se continuiamo la discussione forse riuscirai a comprendere ciò che ora non capisci
3) magari così il mio programma non funziona, qualcuno lo usa per implementare il software che gestisce un razzo, il razzo scoppia e moriamo tutti!

;)
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da vaeVictis »

A meno che il buon UbuNuovo non riesca a fartelo capire scrivendotelo in qualche altra lingua, le spiegazioni te le ha già date e anche più di una volta.
Continuare a parlarne in modo circolare non porta a una comprensione.

Prenditi del tempo, rifletti e magari tra qualche giorno ritorna a postare eventuali dubbi.
Così non stai andando da nessuna parte.

Valuta anche l'idea di provare a dare un'occhiata a qualche tutorial relativo alle espressioni regolari.
Su un forum si può aiutare, ma fino a una certa.

p.s.:
In quanto ai buoni motivi...
1) Non è chi ti aiuta a poterti spiegare come spiegarti. Al massimo ti si può dire che non sei chiaro, ti si può dare una mano, ti si può interpretare... ma la chiarezza è una cosa il cui onere dal mio punto di vista spetta a chi apre la discussione.
2) ...
3) È anche probabile che il razzo faccia la fine del cetriolo che sfugge di mano all'ortolano
Ultima modifica di vaeVictis il lunedì 30 giugno 2014, 21:23, modificato 2 volte in totale.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da UbuNuovo »

È del tutto inutile che continui a ripetrti le stesse cose!
Fai delle prove e cerca di documentarti sulle espressioni regolari perl compatibili.
Usare codice senza avere un idea di come funzioni non ti insegna niente.
Quando avrai le idee più chiare fammi un fischio.
:ciao:

edit: Vae mi hai anticipato, stavo scrivendo
Salva l'Ucraina! 🇺🇦
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da melfnt »

Non è mica che parlo in modo circolare senza motivo.

I miei dubbi li ho espressi in tre punti in questo post.
Le idee chiare non ce le ho, altrimenti non sarei qui, soprattutto per quanto riguarda il modo in cui grep interpreta l'espressione regolare.

Ti ho detto che secondo me ci sono due modi per far matchare la stringa con la RE, e tu continui a ripetermi che "entrambi portano allo stesso risultato".
Al che ti ho fatto notare: "ma non è che posso scegliere quale modo usare cambiando il codice, sono semplicemente due modi in cui la stringa potrebbe venire associata alla RE" (la storia del rosso e del verde).
Il mio dubbio è: se non ho il controllo su cosa viene associato al verde e cosa al rosso, il mio programma potrebbe non funzionare.

Ti ripeto che non è una questione di codice che uso, lo stesso codice porta a due diverse interpretazioni.
Perciò provo a farti un altro esempio:

Abbiamo l'espressione regolare "uno \K(.*?)(?=tr.*)"
Come viene matchata con "uno due tre quattro"?

uno due tre quattro
uno due tre quattro

Se pensi di aver già risposto a questa domanda, potresti per favore linkarmela in questo topic?
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da UbuNuovo »

Poi non intervengo più, ti ho detto su cosa documentarti, comunque...
Nel primo post di questa pagina:
...
la parte che rende sicuramente ungready il match è (.*?)(?=/)
in pratica viene presa la parte compresa da "$prima" fino alla prima barra (esclusi).
L'interpretazione dell'espressione regolare è una soltanto!
Salva l'Ucraina! 🇺🇦
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da UbuNuovo »

Salva l'Ucraina! 🇺🇦
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da Zoff »

@vaeVictis,UbuNuovo: Linkare manuali e documentazione è utile fino ad un certo punto, se l'utente continua a fare domande risposte alla RTFM sono inutili e mettergli di fronte chilometri di letteratura non lo aiuta. Se credete di aver dato il vostro apporto alla discussione non è necessario giustificarvi o fare altri interventi, diversamente, a costo di essere ripetitivi non guasta continuare a cercare di spiegare le cose all'utente, come da Regolamento (Sezione IV art 1,4,5 e soprattutto 8 ).
@melfnt Ve bene la curiosità ma non puoi pretendere che gli utenti ti spieghino per filo e per segno tutti gli esempi che tiri fuori, se vuoi imparare ci devi mettere del tuo.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: [risolto]espressioni regolari, ottenere una parte di str

Messaggio da melfnt »

@UbuNuovo: era quello che credevo di aver capito anche io (per questo ho messo [risolto]), però successivi interventi mi hanno fatto sorgere ulteriori dubbi.

@Zoff: d'accordo, ora che ho ottenuto le risposte che cercavo smetto di fare domande e mi metto a programmare.
;)

Fra un po' vi posto un frammento di codice che spiega perché non posso risolvere il problema con "find" o "ls".
;)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti