2010-06-14 5 views
4

Для каждой строки мне нужно напечатать # каждые 6 символов.Как напечатать строку таким образом

Например:

example_string = "this is an example string. ok ????" 

myfunction(example_string) 

"this i#s an e#xample# strin#g. ok #????" 

Что является наиболее эффективным способом сделать это?

ответ

9

Как насчет этого?

'#'.join([example_string[a:a+6] for a in range(0,len(example_string),6)]) 

Он работает довольно быстро, тоже. На моей машине, пять микросекунд на строку 100 символов:

>>> import timeit 
>>> timeit.Timer("'#'.join([s[a:a+6] for a in range(0,len(s),6)])", "s='x'*100").timeit() 
4.9556539058685303 
+0

Pffft. Почему я не подумал об этом ... –

+0

+1, это более pythonic, чем моя версия в регулярном выражении. – Amarghosh

+0

Возможно, лучше использовать 'xrange' вместо' range' в Python 2.x. –

4
>>> str = "this is an example string. ok ????" 
>>> import re 
>>> re.sub("(.{6})", r"\1#", str) 
'this i#s an e#xample# strin#g. ok #????' 

Update:
Обычно точка соответствует всем символам, кроме новых линий. Используйте re.S, чтобы совместить точки со всеми символами, включая символы новой строки.

>>> pattern = re.compile("(.{6})", re.S) 
>>> str = "this is an example string with\nmore than one line\nin it. It has three lines" 
>>> print pattern.sub(r"\1#", str) 

this i#s an e#xample# strin#g with#
more #than o#ne lin#e
in i#t. It #has th#ree li#nes

+0

не работает, если есть '\ n' в строке –

+1

Флип' re.DOTALL' флаг ака 're.S' (одна строка mode), чтобы точка соответствовала всем этим. См. Обновление @John – Amarghosh

2
import itertools 

def every6(sin, c='#'): 
    r = itertools.izip_longest(*([iter(sin)] * 6 + [c * (len(sin) // 6)])) 
    return ''.join(''.join(y for y in x if y is not None) for x in r) 

print every6(example_string) 
Смежные вопросы