Страница 1 из 2

Калькулятор полей

Добавлено: 06 янв 2016, 08:15
KartaBY
Доброго дня.

Есть точечный шейп у которого в атрибутах адресные данные стоят как:

12Мира
234аСоветская

и т.д.
Требуется разнести в калькуляторе полей номер(с буквой если есть) отдельно, а название улицы отдельно.

Помогите составить выражение.

p/s QGIS 2.10.1

Re: Калькулятор полей

Добавлено: 06 янв 2016, 10:14
Denis Rykov

Код: Выделить всё

regexp_substr(  "address" ,  '(^\\d+[а-я]*)')
regexp_substr(  "address" ,  '([А-Я][а-я,\\s]*)')

Re: Калькулятор полей

Добавлено: 06 янв 2016, 12:06
KartaBY
Ух. Круто. Работает. Но немного не так.

( "address" , '(^\\d+[а-я]*)')
"address" - обрабатываемый столбец
(^\\d+[а-я]*) и ([А-Я][а-я,\\s]*) - китайская грамота :-)

Расшифруйте пожалуйста что есть что в "китайской грамоте". Попробую сам доработать код до требуемого функционала.
И если не тяжело, дайте ссылку где можно почитать про "китайскую грамоту".
Спасибо.

Re: Калькулятор полей

Добавлено: 06 янв 2016, 12:12
Denis Rykov
Это называется "регулярные выражения". А что именно работает не так? Приведённые вами примеры должны правильно разбираться.

[ Сообщение с мобильного устройства ]

Re: Калькулятор полей

Добавлено: 06 янв 2016, 12:41
KartaBY
regexp_substr( "address" , '(^\\d+[а-я]*)')

Переносит только цифровую часть. Но здесь возможно вопрос в том что корпуса домов написаны латиницей a,b,c.
Поэтому в варианте 23а3 переносит только 23.
Возможно надо фильтровать до первой буквы в верхнем регистре т.к. все улицы начинаются с большой буквы.

regexp_substr( "address" , '([А-Я][а-я,\\s]*)')
Создает пустой столбец без значений.

"Регулярные выражения"
\\d - Это что делает?
\\s - это что делает?
[а-я,\\s] - это что делат?
Нигде не нашел что это значит.

Re: Калькулятор полей

Добавлено: 06 янв 2016, 19:03
Denis Rykov
KartaBY писал(а):Возможно надо фильтровать до первой буквы в верхнем регистре т.к. все улицы начинаются с большой буквы.
Например, так:

Код: Выделить всё

regexp_substr(  "address" ,  '(^[0-9,а-я,a-z]*)[А-Я]+')
KartaBY писал(а):regexp_substr( "address" , '([А-Я][а-я,\\s]*)')
Создает пустой столбец без значений.
Пример адреса приведите.

\\d - цифра
\\s - пробел
\\[а-я,\\s]* - символы из указанного набора могут повторяться 0 и более раз
KartaBY писал(а):Нигде не нашел что это значит.
А где вы искали, если не секрет, в той же Википедии всё подробно расписано.

Re: Калькулятор полей

Добавлено: 07 янв 2016, 08:07
KartaBY
regexp_substr( "address" , '(^[0-9,а-я,a-z]*)[А-Я]+')

Работает как положено!

regexp_substr( "address" , '([А-Я][а-я,\\s]*)')

Тоже работает. Это я был не внимательным. Создавал новое поле как "число". Когда поставил как "текст" то все заработало.

Огромное спасибо за помощь.

з.ы. Буду осваивать регулярные выражения. Про Википедию вы правы. там не искал. :oops:

Re: Калькулятор полей

Добавлено: 07 янв 2016, 08:46
KartaBY
з.ы.2 Вот в таком виде у меня охватывает все возможные случаи написания номера и наименования
regexp_substr( "LABEL" , '(^[0-9,а-я,a-z,_,\\s]*)[А-Я]+')
regexp_substr( "LABEL" , '([\\s,А-Я][А-Я,\\s,-]*)')

Re: Калькулятор полей

Добавлено: 17 май 2018, 20:44
Svility
Как из такой записи:
Название; 0.68 км; 68
вытащить значение 68 ?

Все записи сформированы по шаблону: “name”; “km” ‘ км’; “num”

Re: Калькулятор полей

Добавлено: 17 май 2018, 20:59
trir
для этого есть именованные группы

Re: Калькулятор полей

Добавлено: 17 май 2018, 21:27
Svility
Чувствую быстро не разобраться(

А нельзя как то описать это так: отобрать значение любых символов начиная с конца поля, до первого пробела или знака ;

Re: Калькулятор полей

Добавлено: 18 май 2018, 07:25
rhot
попал?

Re: Калькулятор полей

Добавлено: 18 май 2018, 10:28
Svility
Почти) есть номера вида 68.1 или 68.1.1 или 68л или 68_1
Хотелось бы отобрать все что находится между ; и концом

Re: Калькулятор полей

Добавлено: 18 май 2018, 11:25
freeExec

Код: Выделить всё

^.+;.+;\\s*([^\\s]+)$'
Интересно, что QGIS не скипает пробелы больше одного перед группой их приходится вырезать. Но я не настоящий сварщик.

Re: Калькулятор полей

Добавлено: 18 май 2018, 11:27
trir

Код: Выделить всё

(?<name>[^;]+);(?<km>[^;]+)км;(?<num>.+)