Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 21, 2008 01:09:13

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

модификация данных в строках

-do
Привет. Вот рабочий вариант вашего примера. У меня openSUSE 10.3 и некоторые буквы русск. алфавита - р, т, ф -
крякозябрят. Буду разбираться. А в латинской транскрипции все работает. Не судите строго, это моя первая
программка по регуляркам: :)

#!/usr/bin/python
# coding: koi8-r
import re
patt_data=r"..-..-....."
patt_time=r"..:..."
patt_1=r"1\)[A-z]+," # дпя русской - ur"1\)[А-я]+,"
patt_9=r"9\)[A-z]+,"
patt_1_8=r"[1-8]\)"
patt_10=r"10\)[A-z]+ [A-z]+ [A-z]+,"
patt_11=r"11\)[A-z]+,"
patt_12=r"12\)[0-9].[0-9],"

file1=open("file_in","r+")
file2=open("file_out","w+")

while 1:
string1=file1.readline()
if not string1:
break
else:
string2=file1.readline()

sub_data=re.findall(patt_data,string1)[0] # data+time
sub_time=re.findall(patt_time,string2)[0]
substr=sub_data+sub_time
string_result= re.sub(patt_data, substr, string1)

sub_1=re.findall(patt_1,string1)[0] # 1) + 9)
sub_9=re.findall(patt_9,string2)[0]
substr=sub_1[2:]+sub_9[2:]
string_result= re.sub(patt_1, substr, string_result)

string_result=re.sub(patt_1_8, "" ,string_result) # удаление 2)...8)

sub_10=re.findall(patt_10,string2)[0] # + 10)...+12)
sub_11=re.findall(patt_11,string2)[0]
sub_12=re.findall(patt_12,string2)[0]
string_result += sub_10[3:]+sub_11[3:]+sub_12[3:]

string_result=string_result.replace("\n","") # удаление \n
string_result=string_result.replace("\\n","")
string_result += "\\n"+"\n" # добавление \n
print string_result

file2.write(string_result)

file1.close()
file2.close()
Вход(file_in):
01-09-2008,1)Sidorov,2)14.05.1996,3)user@host.com,4)120.60,5)net,6)Ushakova,7)26,8)15,\n
15:20,9)Ivan,10)dopolnitelnaia text inform,11)ocenka,12)7.8,\n
01-09-2008,1)Kuznecova,2)27.02.1996,3)user2@host.com,4)115.10,5)net,6)Voroshilova,7)4,8)102,\n
15:40,9)Maria,10)dopolnitelnaia text inform,11)ocenka,12)8.1,\
Выход(file_out):
01-09-2008,15:20,Sidorov,Ivan,14.05.1996,user@host.com,120.60,net,Ushakova,26,15,dopolnitelnaia text inform,ocenka,7.8,\n
01-09-2008,15:40,Kuznecova,Maria,27.02.1996,user2@host.com,115.10,net,Voroshilova,4,102,dopolnitelnaia text inform,ocenka,8.1,\n
с уважением gmorgunov



Офлайн

#2 Окт. 21, 2008 04:22:05

-do
От:
Зарегистрирован: 2008-10-11
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

модификация данных в строках

gmorgunov

… Даже слов нет :)))) … это ИДЕАЛЬНО (в моем понимании, на данный момент знания Python :) ) то, что изначально витало в голове как итоговый результат — СПАСИ тебя БОг! :) — легко читаемый код, с возможностью изменения параметров запросов …

По поводу работы с кириллическим текстом все работает! Прогнал через Komodo — “эталонный” вариант приведенный в первом посте — результат вышел с первого раза.
Проблема возникла сразу если отступить от исходного шаблона добавив к примеру пустую строку в начале текста или любую не пустую строку не удовлетворяющую шаблонному результату:

Traceback (most recent call last):
File "C:\regex.py", line 25, in <module>
sub_data=re.findall(patt_data,string1)[0] # data+time
IndexError: list index out of range
С вариантом от BW проработал весь вечер — некоторые алгоритмы в ЕГО методе решения были для меня новые (пришлось лезть в доки, чтобы прояснить некоторые вопросы, относительно возможностей применения) — открыл для себя некоторые интересные вещи, вернее — стали понятны механизмы возможностей работы со строкой …

Так же наметил в ближайшее время разобраться в 13 главе «Python Library Reference» … :)

… всем спасибо за помощь :) … не ожидал такой оперативности в течении суток сразу несколько вариантов и столько пищи для размышлений :) …

вопрос общего характера (не критичный на данный момент, просто в ходе экспериментов задумывался), просто для общего развития и понимания:

— Какой вариант подхода менее/более ресурсоёмкий в отношении использования памяти, времени выполнения подобных задач (работа через регулярные выражения, манипуляции со строками при помощи кортежей и функций или варианты работы через модули cvs и sqlite3 ?



Офлайн

#3 Окт. 21, 2008 06:32:19

-do
От:
Зарегистрирован: 2008-10-11
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

модификация данных в строках

немного оффтопа :) по поводу литературы на компьютерную тематику (затронутую в первом посте) …

есть хороший китайский ресурс в котором собраны линки на книги с разных мест в сети:

ebookee.com.cn — ресурс хоть и китайский :) но книги годные для прочтения, для умеющих использовать английский язык :)

еще удобен dbeBooks

к модераторам: :)

На форуме запрещается:
-использовать нецензурные выражения в заголовке и теле послания;
-прибегать к сознательному обману и оскорбительным высказываниям в адрес собеседника;
-размещать любого вида рекламу, не запрашиваемую участниками форума;
-обсуждать темы, которые были удалены командой сайта.
-затрагивать так или иначе исторические или политические темы.
-обсуждать или выкладывать кряки ПО
читал, вроде бы ничего данным постом не нарушаю :))) , но если все же, что не так … хотел сделать благодарность оказавшим помощь советами :)



Офлайн

#4 Окт. 21, 2008 07:44:11

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

модификация данных в строках

-do
Очень рад, что помогло. И вам приятно, и мне полезно. :)
По себе знаю, самый лучший совет - это рабочий код ( пусть и корявый)
Много времени потратил, пока дошло, что у вас Windows( я делал кипи-паст, отсюда и крякозябры , и \n ).
Хорошая книжка по регуляркам - Perl Ларри Уолла. Без нее - ни фига бы не понял (Россум, Сузи).
За китайские ресурсы спасибо, обязательно посмотрю.

С уважением gmorgunov



Офлайн

#5 Окт. 21, 2008 07:50:58

-do
От:
Зарегистрирован: 2008-10-11
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

модификация данных в строках

в ходе тестирования нашел «багу» :))) несколько дат были в односимвольном формате для чисел дня …
и еще:

sub_1=re.findall(patt_1,string1) # 1) + 9)

полчаса не мог понять, что ему не нравится (Komodo) :))) … пока не пробежал текстовый файл и не нашел … ДВОЙНУЮ фамилию :)))) … типа «Петров-Водкин» … :)))

поправил регулярки и всё заработало! … удобно, черт побери :))), но другие варианты, здесь озвученные, буду «копать» в силу врожденного любопытства и тяги к познанию то же … возможно родится еще более любопытный симбиоз с более широкими возможностями …

… еще раз спасибо всем :)



Офлайн

#6 Окт. 21, 2008 11:27:47

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

модификация данных в строках

igor.kaist
я эту базу данных люблю.. Легкая, удобная и не требует установки.
Совсем недавно, в небольшом проекте, нужно было как-то хранить данные пользователей. Сначала тоже думал использовать подобие csv, но после того, как пару раз пришлось немного модифицировать структуры данных, то понял, что такой подход неправильный.
igor.kaist
Толи дело sqlite3.. Кроссплатформенна, имеет бинды практически ко всем языкам программирования, а в случае с питоном, вообще идет в комплекте..
Поэтому я заюзал ее + alchemy :)
(Агитация с моей стороны тоже закончена :) )



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version