Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 24, 2014 05:41:08

Dobrodel
Зарегистрирован: 2014-09-24
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Регуляные выражения из sed в Python

Здравствуйте, друзья
Я знаю немного sed в bash и написал вот такой скрипт, который в bash работает:

str = "My dog: Chappy (2332) supper dog"
echo $ str | sed -n 's/.*dog:\(.*​\)([0-9][0-9][0-9][0-9]).*/\1/p'
>>Chappy
Подскажите пожалуйста, как этот скрипт перевести на Python?
В данном случае необходимо выделить текст из строки по шаблону:
'начало строки 'dog: 'необходимый текст'(1234)' что то ещё’

Отредактировано Dobrodel (Сен. 24, 2014 05:43:06)

Офлайн

#2 Сен. 24, 2014 06:15:52

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Регуляные выражения из sed в Python

В Питоне за регулярные выражения отвечает модуль re . Использовать его можно по разному, например так:

import re
str = "My dog: Chappy (2332) supper dog"
re.findall('.*dog:\ (.*?)\ \([0-9][0-9][0-9][0-9]\).*', str)
---
['Chappy']



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 24, 2014 06:22:16

Dobrodel
Зарегистрирован: 2014-09-24
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Регуляные выражения из sed в Python

Благодарю Вас.
То что надо))

Офлайн

#4 Сен. 24, 2014 06:56:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

Регуляные выражения из sed в Python

У JOHN_16 там слишком много недочётов: str перекрывает имя типа, цифры записаны вдвойне некомпактно, лишнее экранирование пробелов.

>>> import re
>>> 
>>> s = 'My dog: Chappy (2332) supper dog'
>>> 
>>> m = re.search(r'dog: (\S+) \(\d{4}\)', s)
>>> name = m and m.group(1)
>>> name
'Chappy'
>>>



Офлайн

#5 Сен. 24, 2014 09:06:09

Dobrodel
Зарегистрирован: 2014-09-24
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Регуляные выражения из sed в Python

Благодарю Вас.
Подскажите пожалуйста, как поменять запрос, если перед словом dog будет два символа возврата строки \n\n?

Офлайн

#6 Сен. 24, 2014 09:51:48

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

Регуляные выражения из sed в Python

>>> import re
>>> 
>>> s = 'My\n\ndog: Chappy (2332) supper dog'
>>> 
>>> m = re.search(r'\n{2}dog: (\S+) \(\d{4}\)', s)
>>> name = m and m.group(1)
>>> name
'Chappy'
>>>



Офлайн

#7 Сен. 24, 2014 09:54:33

Dobrodel
Зарегистрирован: 2014-09-24
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Регуляные выражения из sed в Python

Благодарю. Вы очень меня выручили.
Приятно иметь дело с людьми знающими своё дело.

Офлайн

#8 Сен. 24, 2014 10:47:08

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Регуляные выражения из sed в Python

py.user.next
я лишь переделал код автора), хотя в целом конечно вы правы. Мой недочет, голова слишком забита…устал я



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#9 Сен. 24, 2014 10:58:43

Dobrodel
Зарегистрирован: 2014-09-24
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Регуляные выражения из sed в Python

Друзья, подскажите еще как вложить тест в регулярное выражение?

str = «dog» 
reg = {0} (\S+).*\(\d{4}\).format(str)

Так как вышеозначенный код естественно выдаёт ошибку:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range


И еще, если символы \n находятся в строке с английскими буквами, то , то фильтр срабатывает и возвращает то что нужно, однако если он находится в строке с русскими буквами, то возвращает пустое значение.
Подскажите что можно предпринять?

Отредактировано Dobrodel (Сен. 24, 2014 14:35:06)

Офлайн

#10 Сен. 24, 2014 23:35:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

Регуляные выражения из sed в Python

JOHN_16
я лишь переделал код автора
Это-то понятно, но он писал, находясь под ограничениями sed'а, тогда как на момент появления sed'а многих вещей ещё просто не существовало. Кстати, первый сетевой червь был написан с использованием sed'а :) Хоть это и было очень давно, но до сих пор принято sed'овый код писать в том стиле, чтобы во всех sed'ах он работал одинаково.

Dobrodel
Друзья, подскажите еще как вложить тест в регулярное выражение?
Не называй переменную str, назови её s или text. str - это имя класса. Хоть оно и не зарезервировано, оно тебе понадобится, когда нужно будет что-то превратить в строку.

>>> s = 'dog'
>>> reg = r'{} (\S+).*\(\d{{4}}\)'.format(s)
>>> reg
'dog (\\S+).*\\(\\d{4}\\)'
>>>



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version