Уведомления

Группа в Telegram: @pythonsu

#1 Март 5, 2018 21:47:54

Karalov86
Зарегистрирован: 2016-06-17
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена текста в файлах с увелечением числового значения

Подскажите пожалуйста. Есть текстовый файл в котором нужно найти нужные строки и заменить в них числовое знание. Например такое содержимое файла:
“”“
город Стамбул 12
город Стамбул 16
город Стамбул 41
”“”
и т.д.
Мне нужно написать код который будет увеличивать числа напротив слов “город Стамбул” ровно на 2. То есть вместо 12 должно стать 14, вместо 16 - 18, вместо 41 - 43. При этом цифры которые будут напротив Стамбула я не знаю заранее
Вот код который заменяет Стамбул 12 на Стамбул 14, но только если Стамбул 12 точно будет:

 import re
first = open("Stambul.txt").read()
change = open("StambulNew.txt", "w")
change.write(re.sub( "город Стамбул 12","город Стамбул 14", first))
change.close()
Как сделать так что бы программа всегда увеличивала значение на 2 какие бы цифры не встретила?

Отредактировано Karalov86 (Март 5, 2018 21:50:44)

Офлайн

#2 Март 5, 2018 23:11:08

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Замена текста в файлах с увелечением числового значения

Один из способов

 import re
change = open("StambulNew.txt", "a", encoding='utf-8')
pat = re.compile("город Стамбул (\d+)")
for first in open("Stambul.txt", encoding='utf-8').readlines():
    res = str(int(re.search(pat, first).group(1))+2)
    change.write("город Стамбул {}\n".format(res))
change.close()

Офлайн

#3 Март 6, 2018 20:12:53

Karalov86
Зарегистрирован: 2016-06-17
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена текста в файлах с увелечением числового значения

Один из способов
а как добиться такого же результата при том что текст не будет состоять из одного повторяющегося словосочетания “город Стамбул”
например

я люблю город Стамбул 12
а ты ненавидишь город Стамбул 16
а он видел город Стамбул 41

что бы менялись тока цифры, и не перетирался текст

Отредактировано Karalov86 (Март 6, 2018 20:13:08)

Офлайн

#4 Март 6, 2018 20:36:39

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Замена текста в файлах с увелечением числового значения

 import re
change = open("StambulNew.txt", "w", encoding='utf-8')
pat = re.compile(r"(?<=город Стамбул\s)(\d+)")
for first in open("Stambul.txt", encoding='utf-8').readlines():
    res = str(int(re.search(pat, first).group(1))+2)
    change.write(re.sub(pat, res, first))
change.close()

Офлайн

#5 Март 9, 2018 13:35:48

Karalov86
Зарегистрирован: 2016-06-17
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена текста в файлах с увелечением числового значения

Romissevd
Пытаюсь подобный код провести для файла с текстом:
<ID>0</ID>
<Type>UPGRADE__1</Type>
<Description>TXT_KEY_UN_M02</Description>
<HarmonyL>8</HarmonyL>
<UnitType>UN_M</UnitType>
<UpgradeTier>1</UpgradeTier>
<AnyAffinityL>3</AnyAffinityL>
<HarmonyL>11</HarmonyL>
Код:
[code python]change = open("UPGRADENEW.txt", "w")
pat = re.compile(r"(?<=<HarmonyL>)(8)(</HarmonyL>\s)")
for first in open("UPGRADE.txt").readlines():
print(first)
res = str(int(re.search(pat, first).group(1))+2)
change.write(re.sub(pat, res, first))
change.close()[/code]

выходит ошибка: AttributeError: ‘NoneType’ object has no attribute ‘group’
Почему она происходит и как её преодолеть?
Понимаю что кусок (?<=<HarmonyL>) уже не правильный, но чем его заменить?

Отредактировано Karalov86 (Март 9, 2018 15:13:13)

Офлайн

#6 Март 9, 2018 18:39:53

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Замена текста в файлах с увелечением числового значения

Твоя регулярка ничего не находит в первой строке, а ты пытаешься вызвать у нее метод group()

 import re
change = open("UPGRADENEW.txt", "w")
pat = re.compile(r"(?<=<HarmonyL>)(\d+)(?=</HarmonyL>\s)")
for first in open("UPGRADE.txt").readlines():
    print(first)
    res = re.search(pat, first)
    if res:
        res = str(int(res.group(1)) + 2)
        change.write(re.sub(pat, res, first))
change.close()

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version