dubbio espressioni regolari python

Efimovic

Nuovo Utente
9
0
Salve

Per un esame sto studiando le regex di Python.
Ho difficoltà con un'esercizio, il seguente:

"Selezionare le righe di testo formate da almeno 4 token di parola (considerando che le parole sono separate solo da spazi)".

Tutti i tentativi che ho fatto non funzionano... quello che più si avvicina è questo:
^(\w+\s){3,}\w+$
Ma non mi seleziona la singola riga ma tutto il testo.

Grazie a chi risponderà.
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Ma non mi seleziona la singola riga ma tutto il testo.
Dividi il testo nelle singole righe e fai regex su ognuna.

Comunque non ho capito cosa significa "4 token di parola", fai qualche esempio.
 

Efimovic

Nuovo Utente
9
0
Il testo è già diviso in righe. Cosa intendi con fai regex su ognuna?

I token, in linguistica computazionale, sono sequenze di caratteri in unità minime di analisi.

Ad
esempio
,
questa
frase
ha
9
token
.
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Il testo è già diviso in righe. Cosa intendi con fai regex su ognuna?
Hai detto "non mi seleziona la singola riga ma tutto il testo". Ho inteso che magari stavi facendo il regex sull'intero testo... ma se mi dici che il testo è gà diviso in righe, allora non capisco il senso di quella frase.

Quindi di fatto tu consideri token qualsiasi sequenza di caratteri delimitata da uno spazio o inizio riga o fine riga e la punteggiatura fa toeken a parte?
Ammettiamo che la variabile lines sia la lista delle linee, io farei così:
Codice:
for line in lines:
   if len(re.findall(r'\w+|[.,:;!?]', line)) > 3:
      print line
La traccia dell'esercizio specifica che i token sono separati solo da spazi, quindi forse la punteggiatura va ignorata. In tal caso la regex diventa semplicemente
Codice:
for line in lines:
   if len(re.findall(r'\w+', line)) > 3:
      print line
Ma se sai che i token sono separati da soli spazi, non serve nemmeno usare regex:
Codice:
for line in lines:
   if len([t for t in line.split(' ') if len(t) > 0]) > 3:
      print line


Per intenderci, con la tua frase d'esempio ottieni:
Codice:
>>> s = "Ad esempio, questa frase ha 9 token."
>>> print re.findall(r'\w+|[.,:;!?]', s)
['Ad', 'esempio', ',', 'questa', 'frase', 'ha', '9', 'token', '.']
>>> print re.findall(r'\w+', s)
['Ad', 'esempio', 'questa', 'frase', 'ha', '9', 'token']
>>> [t for t in s.split(' ') if len(t) > 0]
['Ad', 'esempio,', 'questa', 'frase', 'ha', '9', 'token.']
Ovviamente nel secondo e terzo caso i token sono 7 perchè la punteggiatura non conta. Nel terzo caso hai della punteggiatura mescolata al testo, puoi eliminarla in un secondo momento o ignorarla.
 
Ultima modifica:

Efimovic

Nuovo Utente
9
0
Purtroppo l'esercizio vuole sapere solo l'espressione regolare di per se (Quindi r='... ecc). Il resto di python no.
(Ho scritto python sul titolo, giusto per farvi capire che le stiamo studiando per poi utilizzarle in quell'ambiente).

Il testo dell'esercizio fondamentalmente vuole che sia matchata un'intera riga, dove appunto ci sono almeno 4 token di parola.
Ergo se ho un testo con 5 righe, di cui 3 hanno almeno 4 token, devo avere 3 match.
La punteggiatura va ignorata nel senso che bisogna considerare il testo in input come se appunto non ci fossero caratteri di punteggiatura.

Per ora non riesco a capire come farlo, perché, nonostante il testo sia separato in righe, non riesco a fargli matchare la singola rigola, ma mi matcha l'intero testo. Nonostante l'uso di ^ e $ ...
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!