Модераторы: ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не учитывать совпадение при определенных условиях, нежелательные символы 
:(
    Опции темы
Akella
Дата 22.6.2012, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



ну да, наверное, у буржуев ведь нет знака №

Добавлено через 11 секунд
и программа не юникодная

Добавлено через 39 секунд
в общем я перешёл на #, пока что
PM MAIL   Вверх
Akella
Дата 12.4.2013, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Хочу поднять тему, т.к. есть ещё проблема.
В тексте объявлений есть телефоны.
А также есть вот такой текст:  решения соответствуют требованиями СНиП 31-01-2003 Здания 

Получается так, что выделенная группа цифр определяется, как номер телефона.
Можно что-то придумать такое, что если перед номером есть слово: "СНиП ", то игнорировать найденный текст?
PM MAIL   Вверх
Pfailed
Дата 12.4.2013, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Как была решена предыдущая проблема?

Это сообщение отредактировал(а) Pfailed - 12.4.2013, 15:51


--------------------
PM MAIL   Вверх
Akella
Дата 12.4.2013, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Цитата(Akella @  22.6.2012,  09:08 Найти цитируемый пост)
а вот это работает: 
Выделить всёБез подсветки
1:
    
(?<!#)(?<!\d)(?:\d|\/\d{3,3}\/)[\d-() ]{6,17}


ну с одним символом проблемы нет, а как задать конкретное слово? Например, "СНиП "
PM MAIL   Вверх
Pfailed
Дата 12.4.2013, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



На мой взгляд некорректное выражение. Удовлетворяет строке: решения соответствуют требованиями #01-01-2003 Здания.
А должно ли?

Это сообщение отредактировал(а) Pfailed - 12.4.2013, 17:28


--------------------
PM MAIL   Вверх
DurRandir
Дата 12.4.2013, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 2
Всего: 17



Я бы чуть по другому сделал. Т.к. перед датой может не только "СНИП" идти (и придётся составлять список слов-исключений - регулярка расползётся быстро), я бы вырезал \d{2}-\d{2}-\d{4} как невалидный формат (никто так телефон не делит). Т.е. либо задал для хвоста [\d-() ]{6,17} более строгий формат, либо добавил соответствующий assertion: (?!\d{2,2}-\d{2,2}-\d{4,4}). Итого:

Код

(?<!#)(?<!\d)(?!\d{2}-\d{2}-\d{4})(?:\d|\/\d{3,3}\/)[\d-() ]{6,17}


*добавление* а оно же начнёт матчиться после -01-2003
В общем, лучше уточнить валидный формат или делать доп. проверку *после* поиска и выкидывать такие совпадения. 

Т.к. я не уверен, что даже нечто в духе 

Код

(?<![-#\d])(?!\d{2}-\d{2}-\d{4})(?:\d|\/\d{3,3}\/)[\d-() ]{6,17}


не зацепит лишнего

Это сообщение отредактировал(а) DurRandir - 12.4.2013, 18:22
PM   Вверх
Pfailed
Дата 12.4.2013, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



А в чём фишка писать \d{n,n}? Разве это не эквивалентно \d{n}?

Добавлено через 6 минут и 10 секунд
Цитата(DurRandir @  12.4.2013,  18:16 Найти цитируемый пост)
не зацепит лишнего

Но и не отработает на валидной (по условию) строке: решения соответствуют требованиями -01-01-2003 Здания


--------------------
PM MAIL   Вверх
Pfailed
Дата 12.4.2013, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Вариация на тему моего первого поста в этой теме
Код

/((?:#|СНиП)\s*(?:\d|\/\d{3,3}\/)[\d-() ]{6,17})|(\b(?:\d|\/\d{3,3}\/)[\d-() ]{6,17})/

Уже в коде смотрим на вторую match группу. Если она определена -- берем ее значение. Если не определена -- переходим на следующую итерацию.

Это сообщение отредактировал(а) Pfailed - 12.4.2013, 18:44


--------------------
PM MAIL   Вверх
DurRandir
Дата 12.4.2013, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 2
Всего: 17



Цитата
А в чём фишка писать \d{n,n}? Разве это не эквивалентно \d{n}?

Да я не везде исправил. Эквивалентно)

Цитата
Но и не отработает на валидной (по условию) строке: решения соответствуют требованиями -01-01-2003 Здания 

"Если у вас есть проблема, и вы собираетесь решать ее с использованием регулярных выражений, то у вас есть две проблемы" в полный рост, в общем то) Можно только гадать, подойдёт или не подойдёт под реальные данные, которые есть у Akella.

Это сообщение отредактировал(а) DurRandir - 12.4.2013, 18:42
PM   Вверх
Akella
Дата 13.4.2013, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Цитата(Pfailed @ 12.4.2013,  18:40)
Вариация на тему моего первого поста в этой теме
Код

/((?:#|СНиП)\s*(?:\d|\/\d{3,3}\/)[\d-() ]{6,17})|(\b(?:\d|\/\d{3,3}\/)[\d-() ]{6,17})/

Уже в коде смотрим на вторую match группу. Если она определена -- берем ее значение. Если не определена -- переходим на следующую итерацию.

Не то.

user posted image

а НЕ должно находить

Добавлено через 9 минут и 49 секунд
Цитата(DurRandir @  12.4.2013,  18:16 Найти цитируемый пост)
(?<![-#\d])(?!\d{2}-\d{2}-\d{4})(?:\d|\/\d{3,3}\/)[\d-() ]{6,17}


а вот это уже норм  smile

Добавлено через 10 минут и 8 секунд
Можно его словесно расшифровать?
PM MAIL   Вверх
Pfailed
Дата 13.4.2013, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Цитата(Akella @  13.4.2013,  12:36 Найти цитируемый пост)
а НЕ должно находить

В какой match группе нашлось? Я же написал вам, что нужно смотреть только на вторую match группу.
Все исключения в первую match группу, все подходящие во вторую.


--------------------
PM MAIL   Вверх
DurRandir
Дата 14.4.2013, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 2
Всего: 17



Цитата
Можно его словесно расшифровать? 

Я в том посте постарался описать, как конструировать. Оно состоит из 3х частей - двух отрицательных якорей:

(?<!) - не начинать матчинг, если до позиции стоит -#\d
(?!) - если строка дальше попадает под формат d{2}-\d{2}-\d{4}, то так же не начинать матчинг

и потом положительная проверка под подходящий формат
PM   Вверх
Akella
  Дата 15.4.2013, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Цитата(Pfailed @  13.4.2013,  15:02 Найти цитируемый пост)
В какой match группе нашлось? Я же написал вам, что нужно смотреть только на вторую match группу.


К сожалению, "смотреть" только туда или только сюда - не подходит, потому что в одном случае будет это выражение, а в другом случае будет другое выражение, но программа одна на всех, как говорится. Можно менять только образец (выражение поиска).
PM MAIL   Вверх
tishaishii
Дата 14.9.2018, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Создавал такое рег.выр. импирически около 3х лет. Задача была вынимать объявления из отсканированных и распознанных объявлений, преобразованных в HTML. И нужно было искать номера телефонов в БД, чтобы показывать, обработан ли податчик объявления.

В общем, импирически, рег.выр. хранился в отдельном файле около 2х кб + дополнительный анализ подстрок.
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.1552 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.