Перейти из форума на сайт.Реклама на Ru.Board


Система IP-видеонаблюдения "Линия". Скачать бесплатную демо-версию для 16 камер. НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Регулярные выражения

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10

Открыть новую тему     Написать ответ в эту тему

Hjkma

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
regist123
Слово или набор букв и цифр, которые подпадают под регулярку. Смотрите мои примеры выше.
 

Цитата:
не лучше заменить на  

Можно заменить, но в чем разница? Вроде нету никакой разницы.

Всего записей: 186 | Зарегистр. 04-03-2015 | Отправлено: 20:09 15-03-2017 | Исправлено: Hjkma, 20:10 15-03-2017
sikemo

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
мне кажется, для варианта легче хэш удалять

Всего записей: 986 | Зарегистр. 27-11-2008 | Отправлено: 20:17 15-03-2017
YuS_2



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma

Цитата:
Если несколько из этих слов присутствуют в одной строке, то остается только одно из них, а остальные стираются.

А как должно быть? Мне о том ничего неизвестно.
Вам ведь правильно сказали:

Цитата:
Вы уж лучше пример дайте, как есть и нужный результат

Всего записей: 1651 | Зарегистр. 03-02-2009 | Отправлено: 21:20 15-03-2017
Hjkma

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Поясню на примере, что не так в регулярке. Есть строки

Цитата:
D9QEnuQFohrxsgrlEVNsxvG4o1_1280 kate upton via mariux - reblog.jpg  
KZSDLOZ2vkdq9r5usgul9pgUo1_1280 awesometits - reblog knocking-boots - reblog armageddon a film furshlugginer - reblog niceboobs - reblog mulher - reblog 1235552476009.jpg  
iEkU592H9pvf2prrfy8n1sIKo1_1280 halo armageddon halo.jpg
iEkU592H9pvf2prrfy8n1sIKo1_1280 kate upton kiss glamour hands on man.jpg  
N4Fa7vzXdj11wl1iCnJbAoCPo1_1280 halo a game awesometits - reblog chagrin - reblog.jpg

И есть регулярка с заданными словами "kate upton", "armageddon", "halo"

Цитата:
^(.*?_1280\s).*?(kate upton|armageddon|halo)(.*-\sreblog)?.*(\..*)

И такая регулярка превращает приведеные выше строки в:

Цитата:
D9QEnuQFohrxsgrlEVNsxvG4o1_1280 kate upton via mariux - reblog.jpg  
KZSDLOZ2vkdq9r5usgul9pgUo1_1280 armageddon a film furshlugginer - reblog niceboobs - reblog mulher - reblog.jpg  
iEkU592H9pvf2prrfy8n1sIKo1_1280 halo.jpg
iEkU592H9pvf2prrfy8n1sIKo1_1280 kate upton.jpg  
N4Fa7vzXdj11wl1iCnJbAoCPo1_1280 halo a game awesometits - reblog chagrin - reblog.jpg

Видно, что в первой строке осталось слово "via", которое быть не должно, во второй строке слова "a film" тоже не должно быть, а в третей строке осталось только halo, а остальные заданные слова убрались, чего не должно быть, в четвертой строка регулярка удалила не нужные слова правильно, а в пятой строке остались "a film" чего же опять не должно быть.

Всего записей: 186 | Зарегистр. 04-03-2015 | Отправлено: 08:51 16-03-2017
YuS_2



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma
Это уже не регулярные выражения, это скорее бессистемное удаление непонятных слов
Вам необходимо выделить алгоритм, что должно остаться в строке (все возможные варианты), либо наоборот, что необходимо удалять из строки (опять же, все возможные варианты) - только в этом случае можно говорить о регулярных выражениях и пытаться составить какую-то более-менее рабочую регулярку...
 
Поясню:
Вот этих условий:

Цитата:
в первой строке осталось слово "via", которое быть не должно


Цитата:
во второй строке слова "a film" тоже не должно быть


Цитата:
в третей строке осталось только halo, а остальные заданные слова убрались, чего не должно быть

изначально не было.  
Т.е. для составления регулярного выражения, необходимо иметь представление об алгоритме в целом, а его никак не получить, если все условия не будут выданы сразу...

Всего записей: 1651 | Зарегистр. 03-02-2009 | Отправлено: 10:45 16-03-2017
Hjkma

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Должны остаться в строке только заданные слова, все остальные должны удаляться. Эти "via" и "a film" не являются заданными словами и должны удаляться. И навпротив заданные слова не должны удаляться и в том случае, если в строке присутствуют несколько из заданных слов. Думаю, я ясно обозначил цель, если что-то не ясно, спрашивайте еще раз по конкретнее.
 
P..S. И кроме заданных слов, регулярка также не должна трогать первую часть строки, заканчивающую на _1280 и пробелом, слова стоящие перед " - reblog" и расширение файла в конце строк.

Всего записей: 186 | Зарегистр. 04-03-2015 | Отправлено: 11:20 16-03-2017 | Исправлено: Hjkma, 11:31 16-03-2017
YuS_2



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma

Цитата:
Должны остаться в строке только заданные слова

Где эти заданные слова?

Цитата:
Думаю, я ясно обозначил цель

Это для Вас всё ясно, а вот для меня ... целиком условий Вы не показали, пример же - слишком частный случай, т.к. регэксп составлялся по Вашему первому примеру, а во втором - список заданных слов уже другой...
В общем, учитывая все условия в такой именно постановке, эта задача не решается только регэкспами.  
Тут придется сверять каждое слово со списком и удалять всё, что не подходит...
Способов, конечно, больше, чем один...  
Но, могу предложить простое решение с помощью AkelPad и встроенного скрипта SearchReplace.js
[+] Регулярные выражения  
[+] Зменять на функцию

Код:
Что:-? \b[^\s;,.]*\b
Чем:var x = $0.toLowerCase(); if ( x == " kate" || x == " upton" || x == " armageddon" || x == " halo" || x == "- reblog"){return $0;} else {return "";}

 
Ну и если ещё требуется оставить только один "- reblog" в конце имени файла, то можно дополнительной функцией это сделать:

Код:
Что:- reblog.
Чем:var x = $0.toLowerCase(); if ( x == "- reblog."){return $0;}

 
ЗЫ При копировании, не забываем о лишних концевых пробелах, их не должно быть

Всего записей: 1651 | Зарегистр. 03-02-2009 | Отправлено: 14:59 16-03-2017 | Исправлено: YuS_2, 15:10 16-03-2017
Hjkma

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2

Цитата:
Где эти заданные слова?  

Список таких слов большой, порядка 2 тысяч штук слов и фраз, они всем вам точно нужны? Разве нельзя ли составить регулярку, в которую можно вписывать по свому собственному усмотрению слова с разделителем "|"?  

Цитата:
Но, могу предложить простое решение с помощью AkelPad и встроенного скрипта SearchReplace.js  

А подойдет, если есть несколько заданных слов с пробелами? То есть не нужно отдельно оставлять слова "kate" и "upton", а только чтобы они вместе оставались.  

Цитата:
 x == "- reblog"){

Остается только "- reblog" или еще слово, которое идет перед? А если нет, то это не нужно.
 
Upd. установил Akelpad, замена вроде ограничена 16 тыс. символами, так что не подходит, так как список слов большой, больше 50 тыс. символов.

Всего записей: 186 | Зарегистр. 04-03-2015 | Отправлено: 15:23 16-03-2017 | Исправлено: Hjkma, 15:47 16-03-2017
YuS_2



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma

Цитата:
Список таких слов большой, порядка 2 тысяч штук слов и фраз, они всем вам точно нужны? Разве нельзя ли составить регулярку, в которую можно вписывать по свому собственному усмотрению слова с разделителем "|"?

Да мне-то они не нужны... но 2000 слов в регэксп... это очень медленная процедура получится
 

Цитата:
То есть не нужно отдельно оставлять слова "kate" и "upton", а только чтобы они вместе оставались.

Вот и ещё одно условие... говорю же, чтобы создать что-то правильно работающее, необходимо знать все условия, т.е. абсолютно.
 

Цитата:
Остается только "- reblog" или еще слово, которое идет перед? А если нет, то это не нужно.

Составьте список, что же в итоге требуется...  
Ну откуда мне знать, что какое-то слово остается только при наличии другого, а иначе удаляется? Вот откуда?
Это у Вас информация есть, а вот у меня или у кого-то ещё, её просто нет... и кроме как от Вас, её получить негде.

Всего записей: 1651 | Зарегистр. 03-02-2009 | Отправлено: 15:48 16-03-2017
Hjkma

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Еще раз повторяюсь. Оставить нужно:
1) первую часть строки, заканчивающую на _1280 и пробелом
2) " - reblog" и набор букв и цифр, которые стоят перед " - reblog"
3) заданные слова и фразы, это может быть одно слово или несколько слов. И если присутствуют несколько заданных слов в одном строке, нужно оставлять их всех, не удалять некоторые из них.
4) точка и три буквы в конце строки (расширение файла).

Всего записей: 186 | Зарегистр. 04-03-2015 | Отправлено: 16:10 16-03-2017 | Исправлено: Hjkma, 16:22 16-03-2017
VVL99



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma
Действительно сложно понять алгоритм изменения.

----------
Мои работы

Всего записей: 1160 | Зарегистр. 03-02-2011 | Отправлено: 16:40 16-03-2017 | Исправлено: VVL99, 16:43 16-03-2017
Hjkma

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VVL99
Спрашивайте, что вам непонятно.

Всего записей: 186 | Зарегистр. 04-03-2015 | Отправлено: 16:57 16-03-2017
YuS_2



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma

Цитата:
что вам непонятно.

Как Вам сказать... непонятно всё
 
 16-03-2017

Цитата:
Еще раз повторяюсь. Оставить нужно:

Если по пунктам, то п.п. 1), 2), 4) - особых сложностей не представляют, а вот в п. 3) нет никакой системы и следовательно нет никакой возможности выделить какой-либо алгоритм.
Т.е. это выглядит примерно так: слова могут присутствовать в любом порядке, в любом количестве, кроме того, присутствуют не только слова, но и фразы из нескольких слов (два, три, четыре и т.д.), при этом, если присутствуют отдельные слова из фраз, их необходимо удалять. Никаких специальных разделителей фраз, либо слов, нет абсолютно. Да, можно было бы принять за разделитель пробел, но это противоречит условию о наличии фраз с пробелами... в общем, пойди туда - не знаю куда, найди то - не знаю что...

Всего записей: 1651 | Зарегистр. 03-02-2009 | Отправлено: 05:09 17-03-2017
Hjkma

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Т.е. это выглядит примерно так: слова могут присутствовать в любом порядке, в любом количестве, кроме того, присутствуют не только слова, но и фразы из нескольких слов (два, три, четыре и т.д.), при этом, если присутствуют отдельные слова из фраз, их необходимо удалять. Никаких специальных разделителей фраз, либо слов, нет абсолютно. Да, можно было бы принять за разделитель пробел, но это противоречит условию о наличии фраз с пробелами... в общем, пойди туда - не знаю куда, найди то - не знаю что...

То есть если к примеру есть заданные слова и фразы "word|count of lines|phrases" и есть строка:

Цитата:
Free word count software counting words, lines, pages, phrases, characters.

то нельзя преобразовать в строку:

Цитата:
word phrases

?
 
Добавлено:

Цитата:
Никаких специальных разделителей фраз, либо слов, нет абсолютно. Да, можно было бы принять за разделитель пробел, но это противоречит условию о наличии фраз с пробелами...

 
А возможно ли составить отдельно регэкспы, один для одиночных слов и другой для фраз? Тогда можно сперва вычистить другим рэгекспом для фраз, потом найти поиском строки, в которых есть заданные фразы, вырезать их в отдельный документ, а потом уже обработать оставшийся текст первым регэкспом для слов.

Всего записей: 186 | Зарегистр. 04-03-2015 | Отправлено: 10:32 17-03-2017
YuS_2



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma

Цитата:
то нельзя преобразовать в строку

При условии, что неизвестно сколько вхождений слов/фраз в строке, при том, что необходимо их все оставить, а также неизвестно, что находится между ними, то чистыми регэкспами, в текстовом редакторе, это не сделать. Т.е., сделать-то это можно, но там уже, как минимум, необходимы возможности языков программирования...
Ваш список замены можно попытаться реализовать, например, на powershell, но для этого необходимо свободное время, желание и удачно сложившиеся звезды... хотя последнее не обязательно

Всего записей: 1651 | Зарегистр. 03-02-2009 | Отправлено: 14:05 17-03-2017
Hjkma

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Понятно. Изначально думал, что это решается с помощью регулярки. Ладно, спасибо за то, что уделили время.  
 
Добавлено:
Нашел все же выход, как удалить из текста все, что не соответствует поисковому запросу. Для этого скачиваем Sublime Text 3, строим из списка слов и фраз длинную регулярку с простым разделителем "|", запускаем поиск по этой регулярке, нажимаем на кнопку "найти все" и нажимаем на "Invert selection" в меню выделения и удаляем все выделенное и остаются только нужные слова и фразы. Всем спасибо за участие!

Всего записей: 186 | Зарегистр. 04-03-2015 | Отправлено: 15:51 17-03-2017 | Исправлено: Hjkma, 16:23 17-03-2017
YuS_2



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hjkma

Цитата:
это решается с помощью регулярки.

В том числе и с помощью регэкспов...
 

Цитата:
Нашел все же выход

Ну, раз уж решение найдено...  
Кстати, а с большими объемами данных, проверена работа этого редактора?
Тем не менее, может быть кому-нибудь ещё пригодится решение на powershell:
script.ps1

Код:
$f_in='.\test.txt'
$f_out='.\test-out.txt'
$f_lst='.\test_compare.txt'
if (test-path $f_out){del $f_out}
$arr=gc $f_lst
 
gc $f_in|%{
    $b=$null
    $a = $_ -replace "^(.*?_1280).*", '$1'
    $ext = $_ -replace ".*(\..*)", '$1'
    $arrind = @()
    foreach($str in $arr){
        if ($_ -match $str){
            $c=$_|sls "$str(\s*-\s*reblog)?" -allmatches
            for($i=0; $i -lt ($c.matches.length);$i++){
                $arrind += @(
                    "$($c.matches[$i].index) $($c.matches[$i].value)"
                )  
            }
        }
    }
    $a + " " + [string]$(
        $arrind|sort|%{$_ -replace "^\d+\s"}
    ) + $ext
}|out-file -enc default $f_out

где:  
$f_in - путь и имя файла с данными
$f_out - путь и имя выходного файла
$f_lst - путь и имя файла со списком остающихся слов/фраз

Всего записей: 1651 | Зарегистр. 03-02-2009 | Отправлено: 21:28 17-03-2017 | Исправлено: YuS_2, 18:03 18-03-2017
Hjkma

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
С большими объемами данных работа уже проделана, но все равно спасибо за скрипт и за то, что уделили свое время моей проблеме!

Всего записей: 186 | Зарегистр. 04-03-2015 | Отправлено: 10:22 18-03-2017
VVL99



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
del

----------
Мои работы

Всего записей: 1160 | Зарегистр. 03-02-2011 | Отправлено: 17:46 22-03-2017 | Исправлено: VVL99, 18:56 22-03-2017
VadKomarov



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Приветствую всех. Помогите разобраться или посоветуйте.
в общем суть такая пишу процедуру на Delphi в ней есть переменные Reg: TRegEx; M: TMatchCollection; в которую помещаются данные и потом обрабатываясь этим куском кода выдает результат.

Код:
 
...
M:=Reg.Matches(form1.Memo2.Lines.Text);
...
for j := 1 to m.Groups.Count-1 do begin
text1:='{'+inttostr(j)+'}';
text2:=M.Groups.Item[j].Value;
while pos('  ',text2)>0 do text2:=StringReplace(text2,'  ',' ',[rfReplaceAll]);
replstring:=StringReplace(replstring,text1,text2,[rfReplaceAll]);
end;

 
Регулярное выражение любое но к примеру Фамилия (.*)  Имя (.*)  \r\nОтчество (.*)  \r\nДата рождения:год (\d{1,4})  месяц (\d{1,2})  число (\d{1,2})   а выборка по группе происходит в таком выражении Работник {1} {2} {3} {6}.{5}.{4} года рождения
 
Я можно сказать вообще не знаю регулярных выражений но большая просьба объясните можно ли  написать именно регулярное выражение таким образом что при выборе даты проверялось количество символов и в регулярном выражении добавлялся "0", а так же что бы Фамилия, Имя, Отчество сразу становились с заглавной буквы.


Пример:
Фамилия ИВАНОВ Имя ИВАН
Отчество ИВАНОВИЧ
Дата рождения:год 1900 месяц 1 число 15

должно получиться:
Работник Иванов Иван Иванович 15.01.1900 года рождения
а сейчас выдаёт:
Работник ИВАНОВ ИВАН ИВАНОВИЧ 15.1.1900 года рождения


 
Если в чем то не прав то буду рад любым дельным советам.
Заранее спасибо.

Всего записей: 82 | Зарегистр. 01-05-2005 | Отправлено: 04:24 24-03-2017 | Исправлено: VadKomarov, 04:53 24-03-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Регулярные выражения

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2017

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru