@ssneg

К гуру RegExp-а — как уменьшить число в строке?

Добрый день!
У меня есть большая XML-ка. В ней есть разные тэги, в т.ч. вот такие: <*x>828<*/x> (несколько тысяч). Я хочу сдвинуть всё на 120 точек влево, т.е. мне нужно заменить вышеозначенную строку на <*x>708<*/x>.

Мой малый опыт несбывшегося программиста подсказывает, что Notepad++ и регулярные выражения мне помогут. Но как именно? Прошу помощи!

Спасибо! :)
  • Вопрос задан
  • 3162 просмотра
Решения вопроса 1
conf
@conf
Ruby developer
На PHP:
<?php
$result = preg_replace_callback('/(<[^>]+>)(\d+)(<[^>]+>)/', function($matches) { return $matches[1] . ($matches[2] - 120) . $matches[3]; } , '<*x>828<*/x> <*x>120<*/x> <*x>5<*/x>');
var_dump($result);

string(37) "<*x>708<*/x> <*x>0<*/x> <*x>-115<*/x>"

P.S. Странные у вас теги какие-то, обычно закрывающий тег выглядит как </*x>, а не <*/x>
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
IkaR49
@IkaR49
Если то, что вы привели требуется дословно, то вот сразу для notepad'а:
Найти: (<\*x>)(828)(<\*\/x>)
Заменить на: \1708\3
Ответ написан
avalak
@avalak
XML на регулярках… ненене.
# coding: utf-8

import codecs
from lxml import etree

ENCODING = 'utf-8'
XML_SOURCE_FILE = 'source.xml'
XML_OUT_FILE = 'source.out.xml'
VALUE = -120
TAG_NAME = 'id'

with codecs.open(XML_SOURCE_FILE, encoding = ENCODING) as xml_source:
  root = etree.parse(xml_source).getroot()

for tag in root.iter(TAG_NAME):
  tag.text = str(int(tag.text) + VALUE)

with codecs.open(XML_OUT_FILE, 'w', encoding = ENCODING) as xml_out:
  xml_out.write(etree.tostring(root, pretty_print = True, encoding = ENCODING, xml_declaration = True))

И xmllint для профилактики не забудьте.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы