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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите составить регулярное выражение, регулярные выражения 
:(
    Опции темы
alyam
Дата 21.6.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



есть файл с строками:
Ленина 5-3-11
пр-т 50 лет Октября 7-31
с.Горяйновка пушкина 48-4
с.Горяйновка пушкина 46

т.е. село улица дом-корпус(если есть)-квартира(если есть)

нужно разделить название села+улицу, дом\корпус, квартира если есть... если нету, то поставить перенос строки...
и записать отдельно в разные файлы.
итого получится 3 файла street.txt, home.txt, kv.txt
подскажите регулярное выражение

Это сообщение отредактировал(а) alyam - 21.6.2007, 10:51
PM MAIL   Вверх
amg
Дата 21.6.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 38
Всего: 50



Код

open INP,         'input.txt'  or die "$!\n";
open STREET, '>', 'street.txt' or die "$!\n";
open HOME,   '>', 'home.txt'   or die "$!\n";
open KV,     '>', 'kv.txt'     or die "$!\n";

while (<INP>) {
  chomp;
  m/(.+?)\s+([\d\-]+)$/ or next;
  print STREET "$1\n";
  
  my @p = split /-/, $2;
  if      (@p == 1) {
    print HOME "$p[0]\n";        print KV "\n";
  } elsif (@p == 2) {
    print HOME "$p[0]\n";        print KV "$p[1]\n";
  } elsif (@p == 3) {
    print HOME "$p[0]\\$p[1]\n"; print KV "$p[2]\n";
  } else            {
    print "Invalid: $_\n";
  }
}

close INP;
close STREET;
close HOME;
close KV;
А регулярное выражение для этого случая написать не так-то просто. Да и зачем, если можно тупо

Это сообщение отредактировал(а) amg - 21.6.2007, 12:24
PM MAIL   Вверх
nitr
Дата 21.6.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



P.S.: в этом тупо (
Цитата(amg @  21.6.2007,  12:21 Найти цитируемый пост)
Да и зачем, если можно тупо
) даже лучше. Если писать регулярку, то входные данные должны быть - всё содержимое файлов, т.е. нагрузка на память... ужасно будет. Лучше считывать файл "по порядку", тем более всё "на новой строчке" ;)



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


Шустрый
*


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

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



Имеется вывод программы типа 

Код

12. Имя исполнителя - Название композиции

Никак не соображу как составить регулярное выражение чтобы имя исполнителя записывалось в переменную $imya а название композиции в $kompoz при этом убрав" - "  и порядковый номер.
Порядковый номер- любое целое число всегда заканчивающееся точкой (в данном случае 12.)
Между именем исполнителя и названием композиции всегда "пробел дефис пробел"
Имя исполнителя и название композиции может содержать дефис с пробелом либо до либо после и число с  точками.
В принципе я предполагаю что в качестве разделителя можно использовать комбинацию " - " хотя теоретически такая комбинация может встречаться и в имени исполнителя и в названии композиции.
--------------------
доска объявленийвсе о горных велосипедах 
PM MAIL   Вверх
nitr
Дата 9.7.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



bugmenot, раз разделителя нет, т.е. он неопределён, то как же "комп поймет", что чем является? smile
Или исходные данные надо изменить, и имя исполнителя и название композиции заключить в двойные ковычки или др. "разделитель" ;)


--------------------
PM   Вверх
bugmenot
Дата 9.7.2007, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

раз разделителя нет, т.е. он неопределён, то как же "комп поймет", что чем является?

 это я понимаю и поэтому принял что в качестве разделителя дб " - " т.к. изменить исходные данные для меня очень сложно я использую готовый модуль winamp::control а в нем как на зло процедура getid3tag_artist не работает пришлось использовать getcurrenttitle а у нее вывод именно такой как указано выше.
--------------------
доска объявленийвсе о горных велосипедах 
PM MAIL   Вверх
nitr
Дата 9.7.2007, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



как самое простое
Код

#!/usr/bin/perl
my $str = '12. Имя исполнителя - Название композиции';
my ($imya, $kompoz) = $str =~ /\.\s(.+?)\s-\s(.+)$/;
print "$imya, $kompoz";



--------------------
PM   Вверх
bugmenot
Дата 10.7.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо.
--------------------
доска объявленийвсе о горных велосипедах 
PM MAIL   Вверх
permea
Дата 16.7.2007, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



на входе--файл такого фида
Код

    19                        MM2 parameters
     1  C     13.617000   -8.894300   -0.708500     1     2     7     8     9
     2  C     15.011500   -8.317600   -0.752600     2     1     3    10
     3  C     16.074000   -9.124400   -0.629000     2     2     4    11
     4  C     17.468700   -8.548300   -0.669900     1     3     5    12    13
     5  C     18.491100   -9.679700   -0.543800     1     4     6    14    15
     6  O     19.802600   -9.137500   -0.582500     6     5    16
     7  C     12.598400   -7.756600   -0.617200     1     1    17    18    19
     8  H     13.426100   -9.500400   -1.655000     5     1
     9  H     13.513900   -9.571300    0.202900     5     1
    10  H     15.155400   -7.233800   -0.886400     5     2
    11  H     15.929800  -10.208500   -0.497500     5     3
    12  H     17.625700   -8.002500   -1.658400     5     4
    13  H     17.603200   -7.816200    0.193600     5     4
    14  H     18.334300  -10.225400    0.444700     5     5
    15  H     18.356500  -10.412100   -1.407000     5     5
    16  H     20.537600   -9.955600   -0.604200     5     6
    17  H     11.543300   -8.186800   -0.651700     5     7
    18  H     12.746500   -7.191800    0.361900     5     7
    19  H     12.746400   -7.043200   -1.494000     5     7

читаю его построчно, и в некоторых строках необходимо поменять в шестой колонке цифирь 5 на 21(номера таких строк лежат в программе в отдельном массиве @atom_for_corr, номерация строк начинается с нуля). Очень хотелось бы не ломать форматирование, поэтому тупое split ... print юзать не хочется.
Как?
PM MAIL   Вверх
amg
Дата 16.7.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 38
Всего: 50



О! Брат-химик транс-гексен-3-ол посчитал.
Код

s/^((?: +\S+){5} +) 5 /${1}21 / for @atom_for_corr;
Если разделители колонок - не табуляторы.
PM MAIL   Вверх
nitr
Дата 16.7.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



permea, внутри темы не задавайте множества вопросов, создайте свою...


--------------------
PM   Вверх
permea
Дата 16.7.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



2 amg 
Спс. 
2 nitr
эээ.... а зачем, если тема продолжает предыдущую? Но если надо...
PM MAIL   Вверх
nitr
Дата 16.7.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



permea, правила... правила...
Сейчас уже ненадо создавать, просто впредь...


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




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


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

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