Форум сайта python.su
0
Всем привет!
Я знаю, что строки в питоне нельзя изменять, т.е. можно только заменять. Но как заменить строку так, чтобы сохранилось первоначальное форматирование? Допустим есть строка, слова в которой разделены и пробелами и табами. Мне нужно поменять местами два определенных слова и при этом сохранить эти самые пробелы и табы, количество которых заранее не известно
Отредактировано GGnoob (Окт. 8, 2013 12:23:29)
Офлайн
47
регуляркой
у меня сходу так получилось
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)
Офлайн
568
Без регулярок
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
Офлайн
0
А если эту строку надо еще найти в файле, и может быть так, что менять ничего не надо. Т.е. я пишу:
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)
Офлайн
33
FishHook
Без регулярок
s = “foo one bar two baz”
l =
for word in l:
s = s.replace(word, “%s”)
s = s % (l, l)
print s
Офлайн
568
BudulianinИ это будет правильное поведение, иначе я не понимаю, как можно “поменять местами два определенных слова” если слов больше двух.
Если в строке встретится больше двух вхождений, то ошибку вывалит
Офлайн
0
FishHookНу вообще у меня слова не повторяются, хотя представить такую ситуацию я могу
И это будет правильное поведение, иначе я не понимаю, как можно “поменять местами два определенных слова” если слов больше двух.
.FishHook
s = “foo one bar two baz”
l =
for word in l:
s = s.replace(word, “%s”)
s = s % (l, l)
print s
Офлайн
47
поменять местами все вхождения одного слова на все вхождения другого слова на 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)
Офлайн
33
FishHook
И это будет правильное поведение, иначе я не понимаю, как можно “поменять местами два определенных слова” если слов больше двух.
GGnoobСлова могут не повторятся, но заменяемое слово может быть частью другого слова.
Ну вообще у меня слова не повторяются, хотя представить такую ситуацию я могу.
s = "foo one bar two onebaztwo" l = ["one", "two"]
Отредактировано Budulianin (Окт. 8, 2013 17:20:19)
Офлайн
857
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)
Офлайн