dubbio espressioni regolari python

Pubblicità

Efimovic

Nuovo Utente
Messaggi
9
Reazioni
0
Punteggio
24
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à.
 
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
.
 
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:
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 $ ...
 
Pubblicità
Pubblicità
Indietro
Top