Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
14 / 11 / 4
Регистрация: 24.05.2013
Сообщений: 36

Составить регулярку для замены тэгов

01.04.2016, 12:20. Показов 1324. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть файл в кодировке UTF-8. Хочу сделать некоторые замены в строках вида <английский текст> (<русский текст>. Например:
<p>It had a perfectly round door (у нее была совершенно круглая дверь) like a porthole (как иллюминатор), painted green (выкрашенная в зеленый цвет), with a shiny [и т.д.]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import codecs
import re
 
english_re = re.compile( u'[ ]*<p><strong>[^А-Яа-я]+</strong></p>' )
russian_re = re.compile( u'[A-Za-z.,!\\?]+ \\([А-Яа-я]')
 
with codecs.open( 'hobbit_orig.fb2.xml', 'r', encoding='utf8' ) as orig, codecs.open( 'hobbit_out.fb2.xml',  'w',  encoding='utf8' ) as out:
    for line in orig:
        if english_re.match( line ):
            out.write( line.replace( '<p><strong>',  '<p>' ).replace( '</strong></p>',  '</p>' ) )
            continue
            
        if russian_re.match( line ):        
            out.write( line.replace( '<p>',  '<rus>' ).replace( '</p>',  '</rus>' ) )
            continue
        
        out.write( line )
В Python re wizard выражение срабатывает. english_re при запуске скрипта работает. А russian_re не хочет. Сам скрипт в UTF-8.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.04.2016, 12:20
Ответы с готовыми решениями:

Ищу готовую регулярку для замены символов в конкретных блоках
Есть типа тег/блок в тексте. Например (block)(/block). Вложенность не предусмотрена. Кол-во блоков неограниченно. Режим /uim Внутри этих...

Составить регулярку для ценника
Имеется ценник: 5957.00 р. мне нужно добиться такого вида: 5957 р. выводиться так: echo (int)$ar_price.&quot;...

Составить регулярку для поиска символов
Всем привет! Я снова в тупике. Как всегда:) Хочу сделать так: если пользователь вводит в какое-то поле маленькие латинские бувы -...

17
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
01.04.2016, 12:27
Можете привести полноценный пример, например,

входная строка: ХХХ
выходная строка: ZZZ
0
14 / 11 / 4
Регистрация: 24.05.2013
Сообщений: 36
01.04.2016, 12:39  [ТС]
HTML5
1
2
3
4
   <p><strong>It had a perfectly round door like a porthole, painted green.</strong></p>
   <empty-line/>
   <p>The tunnel wound on and on (туннель продолжал виться и виться)</p>
   <empty-line/>
должно заменяться на

HTML5
1
2
3
4
   <p>It had a perfectly round door like a porthole, painted green.</p>
   <empty-line/>
   <rus>The tunnel wound on and on (туннель продолжал виться и виться)</rus>
   <empty-line/>
А я получаю

HTML5
1
2
3
4
   <p>It had a perfectly round door like a porthole, painted green.</p>
   <empty-line/>
   <p>The tunnel wound on and on (туннель продолжал виться и виться)</p>
   <empty-line/>
т.е. if на 13-й строке скрипта ни разу не срабатывает.
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
01.04.2016, 12:54
Метод .match работает с начала строки, а у Вас как я вижу, строки начинаются с «<р>»
1
14 / 11 / 4
Регистрация: 24.05.2013
Сообщений: 36
01.04.2016, 13:09  [ТС]
Чёрт, конечно, нужен search. Какая глупая ошибка.
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
01.04.2016, 14:07
Как вариант:

Python
1
2
3
4
5
6
7
8
9
10
import re
 
string = '''<p><strong>It had a perfectly round door like a porthole, painted green.</strong></p>
<empty-line/>
<p>The tunnel wound on and on (туннель продолжал виться и виться)</p>
<empty-line/>'''
 
eng = re.sub(r'(<p>)(<strong>)(.*)(</strong>)(</p>)', r'\1\3\5', string)
rus = re.sub(r'(<p>)(.*[А-Яа-я]+.*)(</p>)', r'<rus>\2</rus>', eng)
print(rus)
Code
1
2
3
4
<p>It had a perfectly round door like a porthole, painted green.</p>
<empty-line/>
<rus>The tunnel wound on and on (туннель продолжал виться и виться)</rus>
<empty-line/>
1
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
01.04.2016, 17:00
Jabbson, Зачем усложнять?
Python
8
9
rus = re.sub('p(?=>.*[а-я])|(?i)(?<=[а-я].\)</)p', 'rus', string)
eng = re.sub('(?<=<p>)<strong>|</strong>(?=</p>)', '', rus)
1
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
01.04.2016, 17:07
Цитата Сообщение от Marinero Посмотреть сообщение
Jabbson, Зачем усложнять?
да вроде не сложно примерно ни разу
0
14 / 11 / 4
Регистрация: 24.05.2013
Сообщений: 36
01.04.2016, 18:32  [ТС]
Блин, только я закрыл доки по питону, доки по регэкспам, две статьи на хабре и собрался идти домой (пятница же ж!), как тут... Злыдни

Добавлено через 56 минут
Marinero, у вас одна точка лишняя. Из-за неё регэксп неправильно обработает такую, например, строку: <p>Not me (Не я)</p>

На самом деле спасибо за ответы, очень красивые варианты. Правда, описанная задача была только первым приближением к нужному результату, а на данный момент файл обработан уже в третьем приближении к идеалу
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
01.04.2016, 21:35
arada_s, Если Вы уверены что там не будет знаков препинания…
0
14 / 11 / 4
Регистрация: 24.05.2013
Сообщений: 36
02.04.2016, 01:54  [ТС]
Ну, это смотря где они там будут... В моём файле они вообще проставлены так: <p>Not me (Не я).</p>

Кликните здесь для просмотра всего текста

Кажется, начал более-менее понимать эти ваши регэкспы...

Исходник:
<p>No going upstairs for the hobbit (никаких хождений вверх /по лестнице/ для хоббита): bedrooms (спальные комнаты), bathrooms (ванные комнаты), cellars (погреба), pantries (кладовые для провизии) (lots of these (множество кладовых: «таковых»)), wardrobes (гардеробные) (he had whole rooms devoted to clothes (у него были целые комнаты, предназначенные для одежды; <emphasis>to devote — посвящать, отдавать целиком</emphasis>)), kitchens (кухни), dining-rooms (столовые), all were on the same floor (все были расположены на одном и том же этаже), and indeed on the same passage (и уж конечно, в одном и том же проходе).</p>
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import re
 
line = '''<p>No going upstairs for the hobbit (никаких хождений вверх /по лестнице/ \
для хоббита): bedrooms (спальные комнаты), bathrooms (ванные комнаты), cellars (погреба), \
pantries (кладовые для провизии) (lots of these (множество кладовых: «таковых»)), \
wardrobes (гардеробные) (he had whole rooms devoted to clothes (у него были целые \
комнаты, предназначенные для одежды; <emphasis>to devote — посвящать, отдавать \
целиком</emphasis>)), kitchens (кухни), dining-rooms (столовые), all were on the \
same floor (все были расположены на одном и том же этаже), and indeed on the same \
passage (и уж конечно, в одном и том же проходе).</p>'''
 
result = re.sub( r'(?<=<p>)(.*?)(?= \([А-Яа-я])', r'<strong>\1</strong>', line )
result = re.sub( r'(\).{0,3} )(.*?)(?= \([А-Яа-я])', r'\1<strong>\2</strong>', result )
print( result )
Результат:
<p><strong>No going upstairs for the hobbit</strong> (никаких хождений вверх /по лестнице/ для хоббита): <strong>bedrooms</strong> (спальные комнаты), <strong>bathrooms</strong> (ванные комнаты), <strong>cellars</strong> (погреба), <strong>pantries</strong> (кладовые для провизии) <strong>(lots of these</strong> (множество кладовых: «таковых»)), <strong>wardrobes</strong> (гардеробные) <strong>(he had whole rooms devoted to clothes</strong> (у него были целые комнаты, предназначенные для одежды; <emphasis>to devote — посвящать, отдавать целиком</emphasis>)), <strong>kitchens</strong> (кухни), <strong>dining-rooms</strong> (столовые), <strong>all were on the same floor</strong> (все были расположены на одном и том же этаже), <strong>and indeed on the same passage</strong> (и уж конечно, в одном и том же проходе).</p>
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
02.04.2016, 12:11
Python
8
rus = re.sub(r'<p((?i)(>.*?[а-я].*?</))p>', r'<rus\1rus>', string)
Добавлено через 26 минут
Цитата Сообщение от arada_s Посмотреть сообщение
Кажется, начал более-менее понимать эти ваши регэкспы...
Может и не совсем
Python
1
print(re.sub(r'([a-z -]*)(?=\([а-я])', r'<strong>\1</strong>', line, flags=re.I))
Добавлено через 12 минут
И вообще, бросайте заниматься фигней. Парсить html регулярками — дурной тон, когда есть lxml
0
14 / 11 / 4
Регистрация: 24.05.2013
Сообщений: 36
02.04.2016, 12:24  [ТС]
Цитата Сообщение от Marinero Посмотреть сообщение
Добавлено через 26 минут
Может и не совсем
Python
1
print(re.sub(r'([a-z -]*)(?=\([а-я])', r'<strong>\1</strong>', line, flags=re.I))
Ну тогда уж
Python
1
print(re.sub(r'([a-z][a-z -]*)(?= \([а-я])', r'<strong>\1</strong>', line, flags=re.I))
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
02.04.2016, 12:47
Не хотите забирать пробелы внутрь тэга?
Python
1
print(re.sub(r'(\b[a-z -]+\b)(?= *\([а-я])', r'<strong>\1</strong>', line, flags=re.I))
0
14 / 11 / 4
Регистрация: 24.05.2013
Сообщений: 36
02.04.2016, 15:01  [ТС]
Проблемка... апостроф считается разделителем.

<p>“There’s no hurry (некуда торопиться: «нет спешки»), we have all the day before us (у нас впереди целый день)! We don’t want any adventures here, thank you (не нужны нам здесь никакие приключения, спасибо)!”</p>

Кручу по-всякому, но что-то не получается... Сейчас посмотрю, что этот lxml собой представляет.

Добавлено через 17 минут
Вроде бы lxml тут не поможет... Когда я получу абзац, оборачивать английский текст тегами <strong> мне всё равно придётся регулярками... Или я не прав?

Добавлено через 8 минут
Кстати, мой корявый вариант из-под спойлера работает
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
02.04.2016, 15:04
Цитата Сообщение от arada_s Посмотреть сообщение
Или я не прав?
Не прав, совсем.
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
02.04.2016, 17:24
В чем проблема добавить апостроф в класс символов [a-z’ -]?
Цитата Сообщение от arada_s Посмотреть сообщение
Когда я получу абзац, оборачивать
будете в том же lxml, а как текст разбить — то это вопрос 2-й.
0
14 / 11 / 4
Регистрация: 24.05.2013
Сообщений: 36
02.04.2016, 18:33  [ТС]
Цитата Сообщение от Marinero Посмотреть сообщение
В чем проблема добавить апостроф в класс символов [a-z’ -]?
Всё нормально, я опять туплю
В regex101.com не работает модификатор i для русского языка (а сначала я вообще забыл его поставить), и дефис надо экранировать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.04.2016, 18:33
Помогаю со студенческими работами здесь

Не могу составить регулярку для поиска текста
Собственно имею текст: Собственно делаю код регулярным выражением: if (!preg_match(&quot;/&lt;span...

Составить регулярку для получения всех ссылок на файлы и на папки, которые есть на сервере
static void Main(string args) { WebClient web = new WebClient(); string datasite; ...

Замена тэгов в шаблоне Word на данные из Excel (поиск всех однотипных тэгов)
Прошу помощи по следующей проблеме: есть шаблон договора Word, в данном шаблоне расставлены тэги типа &lt;название фирмы&gt;, &lt;ФИО...

С# составить регулярку
Как разбить такую строку &quot;\\\\server2008\\D\\user\\petya\\my_db.FDB&quot; на server2008 и D:/user/petya/my_db.FDB?

Как составить регулярку?
Есть регуярка preg_match_all('~\*{5} 888poker Hand History for Game.+?collected\h\]+\]~s', $r, $w); И есть файл с текстом например ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru