2014-11-20 3 views
-4

Я пытаюсь заменить пространства с дефисами по одному в каждой возможной позиции в python. Например the man said hi должны составить список всех возможных позиций дефиса, в том числе нескольких черточек:Python заменяет пробелы в строке итеративно

the-man said hi 
the man-said hi 
the man said-hi 
the-man said-hi 
the-man-said hi 
the man-said-hi 
the-man-said-hi 

Длина строки изменяется количество пробелов, поэтому он не может быть исправлением всего 3 мест. Я экспериментировал с re.search и re.sub в цикле while, но пока не нашел приятного пути.

+0

так, что вы пытаетесь, себя? – Kasramvd

+0

Вы решили использовать регулярное выражение? И насколько вы эффективны? – user2097159

ответ

0

Использование itertools.product() производить все комбинации пространственно-и-тире, затем рекомбинируют вашу строку с данными:

from itertools import product 

def dashed_combos(inputstring): 
    words = inputstring.split() 
    for combo in product(' -', repeat=len(words) - 1): 
     yield ''.join(w for pair in zip(words, combo + ('',)) for w in pair) 

Последняя строка молниеносно слова вместе с тире и пробелов (добавление в пустой строке на конец, чтобы составить пары), затем выравнивает это и соединяет их в одну строку.

Демо:

>>> for combo in dashed_combos('the man said hi'): 
...  print combo 
... 
the man said hi 
the man said-hi 
the man-said hi 
the man-said-hi 
the-man said hi 
the-man said-hi 
the-man-said hi 
the-man-said-hi 

Вы всегда можете пропустить первой итерации этого цикла (только с пробелами) с itertools.islice():

from itertools import product, islice 

def dashed_combos(inputstring): 
    words = inputstring.split() 
    for combo in islice(product(' -', repeat=len(words) - 1), 1, None): 
     yield ''.join(w for pair in zip(words, combo + ('',)) for w in pair) 

Все это чрезвычайно память эффективной; вы можете легко обрабатывать входы с сотнями слов, если вы не пытаетесь одновременно хранить все возможные комбинации в памяти.

Чуть больше демо:

>>> for combo in islice(dashed_combos('the quick brown fox jumped over the lazy dog'), 10): 
...  print combo 
... 
the quick brown fox jumped over the lazy-dog 
the quick brown fox jumped over the-lazy dog 
the quick brown fox jumped over the-lazy-dog 
the quick brown fox jumped over-the lazy dog 
the quick brown fox jumped over-the lazy-dog 
the quick brown fox jumped over-the-lazy dog 
the quick brown fox jumped over-the-lazy-dog 
the quick brown fox jumped-over the lazy dog 
the quick brown fox jumped-over the lazy-dog 
the quick brown fox jumped-over the-lazy dog 
>>> for combo in islice(dashed_combos('the quick brown fox jumped over the lazy dog'), 200, 210): 
...  print combo 
... 
the-quick-brown fox jumped-over the lazy-dog 
the-quick-brown fox jumped-over the-lazy dog 
the-quick-brown fox jumped-over the-lazy-dog 
the-quick-brown fox jumped-over-the lazy dog 
the-quick-brown fox jumped-over-the lazy-dog 
the-quick-brown fox jumped-over-the-lazy dog 
the-quick-brown fox jumped-over-the-lazy-dog 
the-quick-brown fox-jumped over the lazy dog 
the-quick-brown fox-jumped over the lazy-dog 
the-quick-brown fox-jumped over the-lazy dog 
+0

Отлично. Ура! Удивительная ширина модулей! –

Смежные вопросы