Форум сайта python.su
Здравствуйте, друзья
Я знаю немного 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
'начало строки 'dog: 'необходимый текст'(1234)' что то ещё’
Отредактировано Dobrodel (Сен. 24, 2014 05:43:06)
Офлайн
В Питоне за регулярные выражения отвечает модуль re . Использовать его можно по разному, например так:
import re str = "My dog: Chappy (2332) supper dog" re.findall('.*dog:\ (.*?)\ \([0-9][0-9][0-9][0-9]\).*', str) --- ['Chappy']
Офлайн
Благодарю Вас.
То что надо))
Офлайн
У 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' >>>
Офлайн
Благодарю Вас.
Подскажите пожалуйста, как поменять запрос, если перед словом dog будет два символа возврата строки \n\n?
Офлайн
>>> 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' >>>
Офлайн
Благодарю. Вы очень меня выручили.
Приятно иметь дело с людьми знающими своё дело.
Офлайн
py.user.next
я лишь переделал код автора), хотя в целом конечно вы правы. Мой недочет, голова слишком забита…устал я
Офлайн
Друзья, подскажите еще как вложить тест в регулярное выражение?
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
Отредактировано Dobrodel (Сен. 24, 2014 14:35:06)
Офлайн
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}\\)' >>>
Офлайн