Замена переменного текста между двумя известными элементами - PullRequest
0 голосов
/ 08 декабря 2010
s = """Comment=This is a comment
Name=Frank J. Lapidus
GenericName=Some name"""
replace_name = "Dr. Jack Shephard"

У меня есть текст в файле, и я пытался выяснить, как искать и заменять строку, чтобы имя = Фрэнк Дж. Лапидус стал именем = д-р. Джек Шефард

Как я мог сделать это в Python? Отредактировано: (Кстати, вторым элементом будет \ n на случай, если вам интересно).

Спасибо.

Ответы [ 3 ]

1 голос
/ 08 декабря 2010

Использование string.replace (задокументировано под http://docs.python.org/library/stdtypes.html#string-methods):

>>> s = """Comment=This is a comment
... Name=Frank J. Lapidus
... GenericName=Some name"""
>>> replace_name = "Dr. Jack Shephard"
>>> s.replace("Frank J. Lapidus", replace_name)
'Comment=This is a comment\nName=Dr. Jack Shephard\nGenericName=Some name'
0 голосов
/ 08 декабря 2010

В качестве альтернативы решению с регулярными выражениями (Jukka), если вы хотите выполнить много таких замен, и весь файл структурирован таким образом, преобразуйте весь файл в словарь, а затем запишите его снова после некоторых замен:

d = dict(x.split("=") for x in s.splitlines() if x.count("=") is 1)
d["Name"] = replace_name
new_string = "\n".join(x+"="+y for x,y in d.iteritems())

Предостережения:
Во-первых, это работает только в том случае, если в именах полей нет символов «=» (игнорируются строки, в которых нет только одного знака =).
Во-вторых, преобразование в dict и обратно не сохранит порядок полей, хотя вы можете по крайней мере отсортировать словарь с некоторой дополнительной работой.

0 голосов
/ 08 декабря 2010

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

import re
pattern = re.compile(r"^Name=(.*)$", flags=re.MULTILINE)
re.sub(pattern, "Name=%s" % replace_name, s)

(Опция re.MULTILINE позволяет ^ и $ соответствовать началу и концу строки соответственно, в дополнение к началу и концу строкистрока.)


Отредактировано, чтобы добавить: Основываясь на ваших комментариях к Ответ Эмиля , похоже, вы манипулируете Desktop Entry файлами,Их синтаксис, по-видимому, очень близок к синтаксису, используемому модулем ConfigParser (возможно, есть некоторые различия в чувствительности к регистру имен разделов и ожидании того, что комментарии должны быть сохранены в течение цикла разбора / сериализации).1020 *

Пример:

import ConfigParser
parser = ConfigParser.RawConfigParser()
parser.optionxform = str # make option names case sensitive
parser.read("/etc/skel/examples.desktop")
parser.set("Desktop Entry", "Name", replace_name)
parser.write(open("modified.desktop", "w"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...