Найти - Пользователи
Полная версия: Регуляные выражения из sed в Python
Начало » Python для экспертов » Регуляные выражения из sed в Python
1 2
Dobrodel
Здравствуйте, друзья
Я знаю немного 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)' что то ещё’
JOHN_16
В Питоне за регулярные выражения отвечает модуль re . Использовать его можно по разному, например так:
import re
str = "My dog: Chappy (2332) supper dog"
re.findall('.*dog:\ (.*?)\ \([0-9][0-9][0-9][0-9]\).*', str)
---
['Chappy']
Dobrodel
Благодарю Вас.
То что надо))
py.user.next
У 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'
>>>
Dobrodel
Благодарю Вас.
Подскажите пожалуйста, как поменять запрос, если перед словом dog будет два символа возврата строки \n\n?
py.user.next
>>> 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'
>>>
Dobrodel
Благодарю. Вы очень меня выручили.
Приятно иметь дело с людьми знающими своё дело.
JOHN_16
py.user.next
я лишь переделал код автора), хотя в целом конечно вы правы. Мой недочет, голова слишком забита…устал я
Dobrodel
Друзья, подскажите еще как вложить тест в регулярное выражение?

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 находятся в строке с английскими буквами, то , то фильтр срабатывает и возвращает то что нужно, однако если он находится в строке с русскими буквами, то возвращает пустое значение.
Подскажите что можно предпринять?
py.user.next
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}\\)'
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB