emil
Апрель 16, 2015 18:53:45
Всем привет!
Ребята, подскажите такую вещь, почему в нижеуказанном примере питон извлекает последнее совпадение?
>>> 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'
doza_and
Апрель 16, 2015 18:57:49
потому что в одном примере плюсик внутри скобок а в другом снаружи
emil
Апрель 16, 2015 20:12:05
Не понял, 1 пример трактую как: найди с начала строки одну или более групп, состоящих из или a или b или с. Логичен был бы результат ('a',), ('b',), ('c',).
2 пример трактую так: найди одно или более отдельных слова в строке и помести их в именнованную группу word. Там три отдельных слова, почему именно первое?
Подскажите где неправильно рассуждаю?
Suguby27
Апрель 16, 2015 20:21:13
Для отладки реджексов используйте онлайн-тестер
https://regex101.com/ там есть отладка и подсветка. Или RegexBuddy
http://www.regexbuddy.com/Вот ваш реджекс с пояснялками как он ищет
https://regex101.com/r/tH0hM3/1
emil
Апрель 16, 2015 20:26:46
Первый сервис я использовал, там дововльно топорная расшифровка. Интересует сама “магия”, почему движок отрабатывает именно так? Вторым инструментом не пользовался, надо затестить, спасибо, когда на win пересяду)))
Suguby27
Апрель 16, 2015 20:32:58
там можно “поиграть” с плюсиками и прочим, что бы понять как оно матчит.
РеджексБадди похож, там еще режим отладки есть (давно правда не пользовал, может что изменилось)
Suguby27
Апрель 16, 2015 20:34:49
а конкретно по вашему вопоосу:
?, +?, ??
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
emil
Апрель 16, 2015 20:54:22
Жадность до добра не доводит))) Так объясните в каком случае жадничает метасимвол + и как, на вышеуказанных примерах?
emil
Апрель 16, 2015 21:06:33
С первым случаем разобрался: повторяющийся захват группы цепляет только последнюю итерацию!
emil
Апрель 16, 2015 21:15:21
Со вторым я тоже разобрался, doza_and, теперь я понял что вы хотели сказать.