Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 8, 2013 10:50:30

GGnoob
Зарегистрирован: 2013-10-01
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Поменять местами слова в строке

Всем привет!
Я знаю, что строки в питоне нельзя изменять, т.е. можно только заменять. Но как заменить строку так, чтобы сохранилось первоначальное форматирование? Допустим есть строка, слова в которой разделены и пробелами и табами. Мне нужно поменять местами два определенных слова и при этом сохранить эти самые пробелы и табы, количество которых заранее не известно

Отредактировано GGnoob (Окт. 8, 2013 12:23:29)

Офлайн

#2 Окт. 8, 2013 11:09:05

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Поменять местами слова в строке

регуляркой

у меня сходу так получилось

l = re.split(r'(word1)(.+?)(word2)', 'garb1 word1 garb2  word2 garb3')
l[1], l[-2] = l[-2], l[1]
print(''.join(l))

Отредактировано bismigalis (Окт. 8, 2013 11:27:32)

Офлайн

#3 Окт. 8, 2013 11:50:51

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Поменять местами слова в строке

Без регулярок

s = "foo one bar two baz"
l = ["one", "two"]
for word in l:
    s = s.replace(word, "%s")
s = s % (l[1], l[0])
print s



Офлайн

#4 Окт. 8, 2013 12:22:49

GGnoob
Зарегистрирован: 2013-10-01
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Поменять местами слова в строке

А если эту строку надо еще найти в файле, и может быть так, что менять ничего не надо. Т.е. я пишу:

     for line in open('test.txt'):
          if line.startswith('Some_word'):
                l = list(line.split())
               d = l.index('word')
               if d > 1:
                    l[1], l[d] = l[d], l[1]
                    line = ''.join(l) + '\n'
          f.write(line)    
В этом примере форматирование строки отличается от первоначального.

Отредактировано GGnoob (Окт. 8, 2013 12:23:59)

Офлайн

#5 Окт. 8, 2013 13:20:59

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Поменять местами слова в строке

FishHook
Без регулярок

s = “foo one bar two baz”
l =
for word in l:
s = s.replace(word, “%s”)
s = s % (l, l)
print s

Если в строке встретится больше двух вхождений, то ошибку вывалит



Офлайн

#6 Окт. 8, 2013 15:37:18

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Поменять местами слова в строке

Budulianin
Если в строке встретится больше двух вхождений, то ошибку вывалит
И это будет правильное поведение, иначе я не понимаю, как можно “поменять местами два определенных слова” если слов больше двух.



Офлайн

#7 Окт. 8, 2013 15:53:08

GGnoob
Зарегистрирован: 2013-10-01
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Поменять местами слова в строке

FishHook
И это будет правильное поведение, иначе я не понимаю, как можно “поменять местами два определенных слова” если слов больше двух.
Ну вообще у меня слова не повторяются, хотя представить такую ситуацию я могу.
А как это
FishHook
s = “foo one bar two baz”
l =
for word in l:
s = s.replace(word, “%s”)
s = s % (l, l)
print s

будет выглядеть на 3-ем питоне?

Офлайн

#8 Окт. 8, 2013 15:56:59

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Поменять местами слова в строке

поменять местами все вхождения одного слова на все вхождения другого слова на python 3

s = "foo one bar two baz two garb one"
l = ["one", "two"]
for idx, word in enumerate(l):
    s = s.replace(word, "{%s}" % idx)
s = s.format(* reversed(l))
print(s)

Отредактировано bismigalis (Окт. 8, 2013 16:04:42)

Офлайн

#9 Окт. 8, 2013 17:13:11

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Поменять местами слова в строке

FishHook
И это будет правильное поведение, иначе я не понимаю, как можно “поменять местами два определенных слова” если слов больше двух.

Нужно поменять цельные слова, а не любые вхождения

GGnoob
Ну вообще у меня слова не повторяются, хотя представить такую ситуацию я могу.
Слова могут не повторятся, но заменяемое слово может быть частью другого слова.

s = "foo one bar two onebaztwo"
l = ["one", "two"]

Или у тебя всё чётко и просто, поэтому такого никогда не произойдёт ? :)



Отредактировано Budulianin (Окт. 8, 2013 17:20:19)

Офлайн

#10 Окт. 8, 2013 22:29:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Поменять местами слова в строке

GGnoob
Допустим есть строка, слова в которой разделены и пробелами и табами. Мне нужно поменять местами два определенных слова и при этом сохранить эти самые пробелы и табы
в любом случае нужно разделить строку на последовательность лексем {<слово>, <разделитель>}
затем обработать полученную последовательность
а затем уже объединить последовательность в строку

>>> import re
>>> 
>>> s = '  garb1  word1  garb2  word2  garb3  '
>>> 
>>> lst = re.findall(r'\S+|\s+', s)
>>> print(lst)
['  ', 'garb1', '  ', 'word1', '  ', 'garb2', '  ', 'word2', '  ', 'garb3', '  ']
>>> 
>>> lst[3], lst[5] = lst[5], lst[3]
>>> out = ''.join(lst)
>>> 
>>> print(repr(out))
'  garb1  garb2  word1  word2  garb3  '
>>>



Отредактировано py.user.next (Окт. 8, 2013 22:34:47)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version