2015-11-29 4 views
5

Moje pytanie jest podobne do tego one, ale z pewnymi modyfikacjami. Po pierwsze muszę użyć Pythona i regex. Mój ciąg to "Cztery partytury i siedem lat temu". i chcę podzielić go na co szósty znak, ale dodatkowo na końcu, jeśli znaki nie dzielą się przez 6, chcę zwrócić puste spacje.chciwy regex podzielony python co n-ta linia

Chcę móc wejścia: 'Four score and seven years ago.'

i idealnie powinno wyjściowa: ['Four s', 'core a', 'nd sev', 'en yea', 'rs ago', '. ']

Najbliżej mogę dostać jest to próba, która ignoruje mój okres i nie daje mi spacje

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

Odpowiedz

4

łatwo to zrobić bez wyrażeń regularnych:

>>> 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', '.  '] 

zapewnia to puste spacje na końcu, o które prosiłeś.

Alternatywnie, jeśli trzeba użyć wyrażeń regularnych:

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

Klucz w obu przypadkach tworzy ciąg ss który ma wystarczająco dużo pustego miejsca na końcu.

+0

Myślę, że chcesz dodać tylko 5 dodatkowych spacji ('ss = s + 5 * '''). Sześć miejsc działa dobrze w/bez przykładu regex; jednak w przykładzie regex otrzymasz ostatni element składający się z 6 spacji, jeśli oryginalna długość łańcucha jest wielokrotnością liczby 6. –

+1

@MikeCovington Very good! Dzięki. Zaktualizowałem odpowiedź, aby obsługiwać ciągi o długościach równych wielokrotności 6. – John1024

1

można użyć to:

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

Powodem nie otrzymujesz końcowy element zawierający okresu jest to, że ciąg nie jest wielokrotnością 6. Dlatego trzeba zmienić, aby dopasować regex 1 do 6 znaków naraz:

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

w celu uzyskania pożądanego dopełnienie swojego ostatniego elementu, wystarczy użyć tego:

>>> [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', '.  ']