Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl, регулярные выражения, получить фрагмент, соответствующий паттерну / 11 сообщений из 11, страница 1 из 1
15.05.2014, 17:20
    #38642585
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl, регулярные выражения, получить фрагмент, соответствующий паттерну
У меня есть ряд строк (адресов), из которых нужно получить наименования улиц.
Код: plaintext
1.
2.
3.
4.
5.
Город
Балахонова
Балахонова 39
Балахонова 39А
Балахонова 39/А
Улицей считается строка, в конце которой через пробел указан номер дома (число или число с буквенным индексом). В приведенном выше примере подходящими будут последние три строки, для них нужно получить название улицы.
Регулярное выражение использую такое: "(.+)\s\d\S*".
На http://www.pcre.ru/eval/ это выражение работает правильно.
Но вот как его применить в коде Perl, не соображу.
Если использовать такой код:
Код: php
1.
$s =~ s/(.+)\s\d\S*/$1/


то в $s попадают также и первые две строки.

Если код чуть усложнить:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
my $s = shift;
if ($s =~ m/(.+)\s\d\S*/)
{
	$s =~ s/(.+)\s\d\S*/$1/;
	return $s;
}
else
{
	return;
}


тогда работает, как мне надо.
Но хотелось бы покороче сделать.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
16.05.2014, 04:58
    #38642984
ambasador
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl, регулярные выражения, получить фрагмент, соответствующий паттерну
Alibek B.,
Не совсем понятно из чего нужно получить, можете привести пример исходных строк?
Возможно вам нужно (.+?) - не жадный квантификатор, или как там его...
...
Рейтинг: 0 / 0
16.05.2014, 08:55
    #38643051
Anjey aka PM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl, регулярные выражения, получить фрагмент, соответствующий паттерну
Alibek B.,

пример возможного формата записи адресов дайте?
...
Рейтинг: 0 / 0
16.05.2014, 09:06
    #38643059
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl, регулярные выражения, получить фрагмент, соответствующий паттерну
Я же пример приводил.
Просто неправильно пользовался регулярными выражениями.
Нужно было делать так:
Код: php
1.
return $1 if ($s =~ m/(.+)\s\d\S*/);
...
Рейтинг: 0 / 0
19.05.2014, 17:27
    #38645518
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl, регулярные выражения, получить фрагмент, соответствующий паттерну
Alibek B.Я же пример приводил.
Просто неправильно пользовался регулярными выражениями.
Нужно было делать так:
Код: php
1.
return $1 if ($s =~ m/(.+)\s\d\S*/);



я в упор не понимаю зачем там \S*
???
...
Рейтинг: 0 / 0
19.05.2014, 20:59
    #38645720
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl, регулярные выражения, получить фрагмент, соответствующий паттерну
Из примеров же видно.
Номер дома начинается с цифры, но может содержать и нецифровые символы (дробь, буквы, кавычки).
...
Рейтинг: 0 / 0
20.05.2014, 13:45
    #38646362
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl, регулярные выражения, получить фрагмент, соответствующий паттерну
Alibek B.Из примеров же видно.
Номер дома начинается с цифры, но может содержать и нецифровые символы (дробь, буквы, кавычки).

ладно, поставим вопрос по другому \S это любой не пробельный символ. значем условие именно не пробельный, если там может быть что угодно в том числе дом 3 a через пробел запишет..хотя это не важно, важно что уже всёравно что там.
у нас пробел цифра - разделитель, и по регулярке получаеться нам важно только что до, а дальше всёравно.
вот и вопрос, зачем заставлять обработчик проверку делать что это не пробельный символ(символ не входящий в группу пробельные)

да и
(.*)\s+\d на дёждней, а то мало ли... кто-то два пробела поставит
...
Рейтинг: 0 / 0
20.05.2014, 14:42
    #38646494
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl, регулярные выражения, получить фрагмент, соответствующий паттерну
Для удобства.
Потом этот же паттерн (в виде переменной) я использую для получения номера дома.
...
Рейтинг: 0 / 0
20.05.2014, 15:37
    #38646598
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl, регулярные выражения, получить фрагмент, соответствующий паттерну
Alibek B.Для удобства.
Потом этот же паттерн (в виде переменной) я использую для получения номера дома.

так на перле наверно как и на пхп, можно сразу

(.*)\s+(\d.*)
из предположения что после названия улицы через пробел(ы) остальное номер дома
...
Рейтинг: 0 / 0
21.05.2014, 09:15
    #38647202
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl, регулярные выражения, получить фрагмент, соответствующий паттерну
Наверное можно.
Я был не уверен, что такой паттерн правильно сработает для всех записей (например первых двух из примера), поэтому подстраховался.
...
Рейтинг: 0 / 0
21.05.2014, 12:54
    #38647478
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl, регулярные выражения, получить фрагмент, соответствующий паттерну
Alibek B.Наверное можно.
Я был не уверен, что такой паттерн правильно сработает для всех записей (например первых двух из примера), поэтому подстраховался.

сработает, только надо вместо \d* поставить \d+
и оно сработает только на строках где
было чтото, после него обязательно были пробелы, и хотябы одна цифра после пробелов
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl, регулярные выражения, получить фрагмент, соответствующий паттерну / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]