1

Тема: Регулярные выражения: поиск похожих строк.

Добрый день.
Есть тв-программа, в которой встречаются подряд идущие похожие строки. Отличия только во времени в начале строки.
Пример (полужирным отмечу такие строки):

14.25 15.15 «Время покажет». [16+]
16.00 «Мужское / Женское». [16+]
12.00 15.00 12.30 15.50 Новости с субтитрами
22.00 Новости с субтитрами

12.20 «Сегодня вечером» с Андреем Малаховым. [16+]
14.25 15.15 «Время покажет». [16+]
16.00 «Мужское / Женское». [16+]
17.00 «Наедине со всеми». [16+]
18.00 Вечерние новости с субтитрами
22.00 Новости с субтитрами
23.00 Новости с субтитрами

18.45 18.55 «Давай поженимся!» [16+]
19.50 «Пусть говорят» с Андреем Малаховым. [16+]
21.00 Время
21.30 Т/с «Старшая дочь». [12+]
23.30 «Вечерний Ургант». [16+]
00.30 01.00 «Вечерний Ургант». [16+]

00.00 01.00 «Познер». [16+]
01.15 Д/ф Премьера. «Непокоренные

ВОПРОС: как мне написать регулярное выражение (Подстановочные знаки), чтобы время две строки сокращались до одной — все время в начале строки, потом название передачи.
То есть
БЫЛО:
23.30 «Вечерний Ургант». [16+]
00.30 01.00 «Вечерний Ургант». [16+]
СТАЛО
23.30 00.30 01.00«Вечерний Ургант». [16+]

В программах с полноценными регулярными выражениями это делается просто.
В InDesign, например так:
Найти:
^([\.\d ]*)(.+)\r([\.\d ]*)\2\r
Заменить на:
$1 $3 $2\r
——————
А как сделать в Word?

2

Re: Регулярные выражения: поиск похожих строк.

Вы имеете в виду только замену одинаковых строк, идущих подряд?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

3

Re: Регулярные выражения: поиск похожих строк.

Я имею в виду подряд идущие строки, которые идентичны после времени.
Например:
07.45 Новости
10.55 11.00 12.10 Новости
12.45 19.00 Новости

4

Re: Регулярные выражения: поиск похожих строк.

tasword пишет:

Я имею в виду подряд идущие строки, которые идентичны после времени.
Например:
07.45 Новости
10.55 11.00 12.10 Новости
12.45 19.00 Новости

В принципе, можно сделать шаблон (и написать макрос) для определенных названий (Новости с субтитрами, Вечерний Ургант, Новости и т.д.).
Но, при этом, названия передачи должны быть абсолютно одинаковыми:
Например, если «Вечерний Ургант». [16+] будет указано без ограничения возраста, без кавычек или с лишними пробелами, то программа уже это не найдет.
Так пойдет?
Если Вас это устроит, я попробую завтра это сделать.
Просто любые одинаковые словосочетания Ворд, кажется, не ищет.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

5

Re: Регулярные выражения: поиск похожих строк.

Alex_Gur пишет:

В принципе, можно сделать шаблон (и написать макрос) для определенных названий (Новости с субтитрами, Вечерний Ургант, Новости и т.д.).

А почему именно для определенных названий? Программ много, и довольно утомительно все названия указывать.

Alex_Gur пишет:

Если Вас это устроит, я попробую завтра это сделать.

Это было бы здорово )

Alex_Gur пишет:

Просто любые одинаковые словосочетания Ворд, кажется, не ищет.

Одинаковые словосочетания ищет, и одинаковые строки ищет.
Вот я такое регулярное выражение написал. Оно ищет две одинаковые строчки (названия тв-передач) при разном времени и ставит время в обеих вместе.

НАЙТИ:
^13([.0-9\s]{5})(*)^13([.0-9\s]{5})(\2)^13
ЗАМЕНИТЬ НА:
^13\1 \3\2^13

Как бы то, что нужно, но одинаковых передач может быть много, то есть, например:
10.30 «Битва экстрасенсов». [16+]
11.30 Х/ф «Тупой и еще тупее». [16+]
13.30 Т/с «Универ». [16+]
14.00 Т/с «Универ». [16+]
14.30 Т/с «Реальные пацаны». [16+]
15.00 Т/с «Реальные пацаны». [16+]
15.30 Т/с «Реальные пацаны». [16+]
16.00 Т/с «Реальные пацаны». [16+]

——————
14.30 15.00 Т/с «Реальные пацаны». [16+]
16.00 Т/с «Реальные пацаны». [16+]
Р. выражение такое уже не найдет. В принципе, можно написать такое, чтобы искало «время время название время название», но будут же и такие:
14.30 15.00 Т/с «Реальные пацаны». [16+]
15.30 16.00 Т/с «Реальные пацаны». [16+]

Вариаций много. Жаль, что регулярка в Word не такая гибкая. Урезанная какая-то.

6

Re: Регулярные выражения: поиск похожих строк.

Просто удивительно! И правда - кое-что нашел.
Нужно будет подумать, что еще тут можно сделать.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

7

Re: Регулярные выражения: поиск похожих строк.

Попробуйте, пожалуйста, так:

НАЙТИ:
^13([.0-9^32\s]{5;})(*)^13([.0-9^32\s]{5;})(\2)^13
ЗАМЕНИТЬ НА:
^13\1 \3\2^13

где ^32 - это пробел,
{5;} - это 5 раз и более

Только почему-то лишние пробелы получаются.
Попробуйте исправить сами.
В крайнем случае, лишние пробелы можно убрать еще одной заменой.

Поскольку я вижу, что Вы - специалист по регулярным выражениям, попутно у меня есть к Вам вопрос:
Что означает выражение \s ?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

8

Re: Регулярные выражения: поиск похожих строк.

Вот так будет без лишних пробелов:

НАЙТИ:
^13([.0-9^32\s]{5;})(*)^13([.0-9^32\s]{5;})(\2)^13
ЗАМЕНИТЬ НА:
^13\1 \3\2^13

Вопрос про \s по-прежнему остается. Без этого выражения, вроде бы, все так же корректно работает:

НАЙТИ:
^13([.0-9^32]{5;})(*)^13([.0-9^32]{5;})(\2)^13
ЗАМЕНИТЬ НА:
^13\1 \3\2^13

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

9

Re: Регулярные выражения: поиск похожих строк.

Еще мне непонятно, почему (*) воспринимается как все любые символы после выражения \1, а не как один символ?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

10

Re: Регулярные выражения: поиск похожих строк.

У вас отлично получилось! Большое спасибо!
\s может я по ошибке применил в своем выражении. Дело в том, что в других программах (напр. Indesign, OpenOffice) этот метасимвол означает любой пробел.
Сейчас посмотрел в справочнике Подстановочных знаков Word, там его нет. Для пробема указан ^0032.
В моем выражении, по всей видимости Word не понял \s как пробел.
А метасимвол * (звездочка) действительно ищет все любые символы, включая конец абзаца.
Жаль, что в Word упрощенные регулярные выражения. По крайней мере в версии, которую я использую (Word 2003). Может в будущем разработчики

11

Re: Регулярные выражения: поиск похожих строк.

Вот такой еще у меня к вам вопрос, если позволите.
В интернете я нашел макрос для Word, который позволяет использовать расширенный вариант регулярных выражений.
Вот адрес:
внешняя ссылка
Он предназначен для более новых версий Word.
Я написал по адресу там разработчику, он чуть переделал под W2003, только я не понял как подключить. Там помимо кода, формы диалога :-\

12

Re: Регулярные выражения: поиск похожих строк.

tasword пишет:

Для пробела указан ^0032.

^0032, как мне представляется, можно сократить до ^32, что я и сделал.

tasword пишет:

А метасимвол * (звездочка) действительно ищет все любые символы, включая конец абзаца.

Мне все же это непонятно. Вот, я ищу просто * (с подстановочными знаками).
У меня программа находит только один любой символ.
Почему же в Вашем примере она находит ВСЕ любые символы ДО КОНЦА АБЗАЦА. 

tasword пишет:

Вот такой еще у меня к вам вопрос, если позволите.
В интернете я нашел макрос для Word, который позволяет использовать расширенный вариант регулярных выражений.
Вот адрес:
внешняя ссылка
Он предназначен для более новых версий Word.
Я написал по адресу там разработчику, он чуть переделал под W2003, только я не понял как подключить. Там помимо кода, формы диалога :-\

Я посмотрю и сразу дам Вам знать.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

13

Re: Регулярные выражения: поиск похожих строк.

«Почему же в Вашем примере она находит ВСЕ любые символы ДО КОНЦА АБЗАЦА».
Вроде там как-то связано с так называемой жадностью/нежадностью поиска.
Если указывать звездочку между символами (напр. В*д), то будет искать любой текст между ними.
В общем, как-то так.

14

Re: Регулярные выражения: поиск похожих строк.

tasword пишет:

«Почему же в Вашем примере она находит ВСЕ любые символы ДО КОНЦА АБЗАЦА».
Вроде там как-то связано с так называемой жадностью/нежадностью поиска.
Если указывать звездочку между символами (напр. В*д), то будет искать любой текст между ними.
В общем, как-то так.

Точно! Большое спасибо.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

15

Re: Регулярные выражения: поиск похожих строк.

tasword пишет:

Вот такой еще у меня к вам вопрос, если позволите.
В интернете я нашел макрос для Word, который позволяет использовать расширенный вариант регулярных выражений.
Вот адрес:
внешняя ссылка
Он предназначен для более новых версий Word.
Я написал по адресу там разработчику, он чуть переделал под W2003, только я не понял как подключить. Там помимо кода, формы диалога :-\

Ну, вот, я установил этот макрос, но, честно говоря, не очень вдохновлен. Вам, возможно, он понравится больше.
Я обещал помочь Вам в установке. (На упомянутой Вами странице есть два фильма, но они сняты на очень высокой скорости, и для их восприятия придется смотреть эти фильмы неоднократно).
Итак:
1) Открываем файл Макрос мультизамены.docm.
2) Разрешаем запуск макросов.
3) Открываем редактор макросов.
4) Перетаскиваем элементы модуль SRUnit и формы SRFiles и SRForms из проекта файла Макрос мультизамены.docm в Normal.
5) Далее открываем пользовательский режим Word и настраиваем панель быстрого доступа, как это показано в видеоролике, чтобы было удобно вызывать макрос мультизамены.  На панель быстрого доступа копируем макрос Normal.SRUnit.ShowSRForm.

Как я понял, Вы пользуетесь Word 2003. Есть ли там панель быстрого доступа, я уже не помню.
Но, насколько я понимаю, там надо запускать макрос  Normal.SRUnit.ShowSRForm (или ShowSRForm).

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

16

Re: Регулярные выражения: поиск похожих строк.

Спасибо! Попробую.

17

Re: Регулярные выражения: поиск похожих строк.

У меня возник вопрос по VBA.
Я с помощью сервиса «Записи макроса» (то есть запись последовательности моих действий в Word) создал такой код:

Sub проход()

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .text = "^13([.0-9^32]{5;})(*)^13([.0-9^32]{5;})(\2)^13"
        .Replacement.text = "^13\1 \3\2^13"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Что мне нужно сюда вручную добавить, чтобы произошла замена всех найденных строк?
Я могу, конечно, несколько раз нажимать «Заменить» и код будет сгенерирован, но мне кажется, можно вручную как-то рациональнее сделать. Или я не прав?

18

Re: Регулярные выражения: поиск похожих строк.

tasword пишет:

У меня возник вопрос по VBA.
Я с помощью сервиса «Записи макроса» (то есть запись последовательности моих действий в Word) создал такой код:

Sub проход()

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .text = "^13([.0-9^32]{5;})(*)^13([.0-9^32]{5;})(\2)^13"
        .Replacement.text = "^13\1 \3\2^13"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Что мне нужно сюда вручную добавить, чтобы произошла замена всех найденных строк?
Я могу, конечно, несколько раз нажимать «Заменить» и код будет сгенерирован, но мне кажется, можно вручную как-то рациональнее сделать. Или я не прав?


Тут все правильно. Команда Заменить все выполняется оператором

Selection.Find.Execute Replace:=wdReplaceAll

Просто запускаете этот макрос - и все.
.MatchWildcards = True - это, судя по всему, режим с подстановочными знаками.

Другое дело, что вместо:

        .Replacement.text = "^13\1 \3\2^13"

нужно написать:

        .Replacement.text = "^13\1\3\2^13"

То есть убрать в шаблоне один пробел после \1.
Иначе в результате получаются лишние пробелы.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

19

Re: Регулярные выражения: поиск похожих строк.

Это я понимаю. Я не совсем точный вопрос задал.

Допустим есть текст:
14.30 Т/с «Реальные пацаны». [16+]
15.00 Т/с «Реальные пацаны». [16+]
15.30 Т/с «Реальные пацаны». [16+]
16.00 Т/с «Реальные пацаны». [16+]

Я делаю поиск-замену и получаю:
14.30  15.00 Т/с «Реальные пацаны». [16+]
15.30 Т/с «Реальные пацаны». [16+]
16.00 Т/с «Реальные пацаны». [16+]

Потом новый поиск-замена и получаю:
14.30 15.00 15.30 Т/с «Реальные пацаны». [16+]
16.00 Т/с «Реальные пацаны». [16+]

Потом еще раз:
14.30 15.00 15.30 16.00 Т/с «Реальные пацаны». [16+]

Мне нужно в макросе продублировать несколько раз этот текст:

Sub проход()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .text = "^13([.0-9^32]{5;})(*)^13([.0-9^32]{5;})(\2)^13"
        .Replacement.text = "^13\1 \3\2^13"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

или есть какая-то команда, которая заставить делать замену, пока не останется ноль замен?

20

Re: Регулярные выражения: поиск похожих строк.

tasword пишет:

или есть какая-то команда, которая заставить делать замену, пока не останется ноль замен?

Можно воспользоваться свойством Found объекта Find для того, чтобы понять, продолжать ли поиск далее, напр:

Sub проход()
Dim textfound as Boolean   
textfound = True
While textfound   
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .text = "^13([.0-9^32]{5;})(*)^13([.0-9^32]{5;})(\2)^13"
        .Replacement.text = "^13\1 \3\2^13"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    textfound = Selection.Find.Found   
Wend
End Sub

21

Re: Регулярные выражения: поиск похожих строк.

yshindin пишет:

Можно воспользоваться свойством Found объекта Find для того, чтобы понять, продолжать ли поиск далее, напр:

Sub проход()
Dim textfound as Boolean   
textfound = True
While textfound   
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .text = "^13([.0-9^32]{5;})(*)^13([.0-9^32]{5;})(\2)^13"
        .Replacement.text = "^13\1 \3\2^13"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    textfound = Selection.Find.Found   
Wend
End Sub

Гениально!

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.