Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 16, 2015 18:53:45

emil
Зарегистрирован: 2013-01-25
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Всем привет!
Ребята, подскажите такую вещь, почему в нижеуказанном примере питон извлекает последнее совпадение?

>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)
А в следующем примере первое совпадение?
>>> p = re.compile(r'(?P<word>\b\w+\b)')
>>> m = p.search( '(((( Lots of punctuation )))' )
>>> m.group('word')
'Lots'

Офлайн

#2 Апрель 16, 2015 18:57:49

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

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

потому что в одном примере плюсик внутри скобок а в другом снаружи



Офлайн

#3 Апрель 16, 2015 20:12:05

emil
Зарегистрирован: 2013-01-25
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Не понял, 1 пример трактую как: найди с начала строки одну или более групп, состоящих из или a или b или с. Логичен был бы результат ('a',), ('b',), ('c',).
2 пример трактую так: найди одно или более отдельных слова в строке и помести их в именнованную группу word. Там три отдельных слова, почему именно первое?
Подскажите где неправильно рассуждаю?

Офлайн

#4 Апрель 16, 2015 20:21:13

Suguby27
Зарегистрирован: 2015-04-07
Сообщения: 26
Репутация: +  4  -
Профиль   Отправить e-mail  

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

Для отладки реджексов используйте онлайн-тестер https://regex101.com/ там есть отладка и подсветка. Или RegexBuddy http://www.regexbuddy.com/
Вот ваш реджекс с пояснялками как он ищет https://regex101.com/r/tH0hM3/1

Отредактировано Suguby27 (Апрель 16, 2015 20:23:18)

Офлайн

#5 Апрель 16, 2015 20:26:46

emil
Зарегистрирован: 2013-01-25
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Первый сервис я использовал, там дововльно топорная расшифровка. Интересует сама “магия”, почему движок отрабатывает именно так? Вторым инструментом не пользовался, надо затестить, спасибо, когда на win пересяду)))

Офлайн

#6 Апрель 16, 2015 20:32:58

Suguby27
Зарегистрирован: 2015-04-07
Сообщения: 26
Репутация: +  4  -
Профиль   Отправить e-mail  

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

там можно “поиграть” с плюсиками и прочим, что бы понять как оно матчит.
РеджексБадди похож, там еще режим отладки есть (давно правда не пользовал, может что изменилось)

Офлайн

#7 Апрель 16, 2015 20:34:49

Suguby27
Зарегистрирован: 2015-04-07
Сообщения: 26
Репутация: +  4  -
Профиль   Отправить e-mail  

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

а конкретно по вашему вопоосу:

?, +?, ??
    The '*', '+', and '?' qualifiers are all greedy; they match as much text as possible. Sometimes this behaviour isn’t desired; 
if the RE <.*> is matched against '<H1>title</H1>', it will match the entire string, and not just '<H1>'. 
Adding '?' after the qualifier makes it perform the match in non-greedy or minimal fashion; 
as few characters as possible will be matched. Using .*? in the previous expression will match only '<H1>'.
https://docs.python.org/2.7/library/re.html

Отредактировано Suguby27 (Апрель 16, 2015 20:35:16)

Офлайн

#8 Апрель 16, 2015 20:54:22

emil
Зарегистрирован: 2013-01-25
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Жадность до добра не доводит))) Так объясните в каком случае жадничает метасимвол + и как, на вышеуказанных примерах?

Офлайн

#9 Апрель 16, 2015 21:06:33

emil
Зарегистрирован: 2013-01-25
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

С первым случаем разобрался: повторяющийся захват группы цепляет только последнюю итерацию!

Офлайн

#10 Апрель 16, 2015 21:15:21

emil
Зарегистрирован: 2013-01-25
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Со вторым я тоже разобрался, doza_and, теперь я понял что вы хотели сказать.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version