2015-11-29 23 views
5

La mia domanda è simile a questa one, ma con alcune modifiche. Prima di tutto ho bisogno di usare python e regex. La mia stringa è: "Quattro punti e sette anni fa". e voglio dividerlo ogni 6 ° carattere, ma in aggiunta alla fine se i personaggi non dividono per 6, voglio restituire spazi vuoti.greedy regex split python ogni ennesima riga

Voglio essere in grado di ingresso: 'Four score and seven years ago.'

E idealmente dovrebbe uscita: ['Four s', 'core a', 'nd sev', 'en yea', 'rs ago', '. ']

Il più vicino che può ottenere è questo tentativo, che ignora il mio periodo e non mi dà gli spazi vuoti

re.findall('.{%s}'%6,'Four score and seven years ago.') #split into strings 
['Four s', 'core a', 'nd sev', 'en yea', 'rs ago'] 

risposta

4

questo è facile da fare senza le espressioni regolari:

>>> s = 'Four score and seven years ago.' 
>>> ss = s + 5*' '; [ss[i:i+6] for i in range(0, len(s) - 1, 6)] 
['Four s', 'core a', 'nd sev', 'en yea', 'rs ago', '.  '] 

Ciò fornisce il vuoto spazi alla fine che hai chiesto.

In alternativa, se è necessario utilizzare le espressioni regolari:

>>> import re 
>>> re.findall('.{6}', ss) 
['Four s', 'core a', 'nd sev', 'en yea', 'rs ago', '.  '] 

La chiave in entrambi i casi è la creazione della stringa ss che ha abbastanza spazio vuoto alla fine.

+0

Penso che tu voglia aggiungere solo 5 spazi extra ('ss = s + 5 * '''). Sei spazi funzionano bene con l'esempio non regex; tuttavia, con l'esempio regex, si ottiene un elemento finale composto da 6 spazi se la lunghezza della stringa originale è un multiplo di 6. –

+1

@MikeCovington Molto buono! Grazie. Ho aggiornato la risposta per gestire stringhe con lunghezze pari a un multiplo pari a 6. – John1024

1

È possibile utilizzare questo:

>>> re.findall('(.{6}|.+$)', 'Four score and seven years ago.') 
['Four s', 'core a', 'nd sev', 'en yea', 'rs ago', '.'] 
3

La ragione per cui non si è trovato l'elemento finale che contiene un periodo è che la stringa non è un multiplo di 6. Di conseguenza, è necessario modificare la vostra regex per abbinare da 1 a 6 caratteri alla volta:

>>> re.findall('.{1,6}','Four score and seven years ago.') 
['Four s', 'core a', 'nd sev', 'en yea', 'rs ago', '.'] 

al fine di ottenere l'imbottitura desiderata del vostro elemento finale, è sufficiente utilizzare questo:

>>> [match.ljust(6, ' ') for match in re.findall('.{1,6}','Four score and seven years ago.')] 
['Four s', 'core a', 'nd sev', 'en yea', 'rs ago', '.  '] 
Problemi correlati