Python 2.7.1 Я пытаюсь использовать регулярное выражение Python для извлечения слов внутри шаблона
У меня есть строка, которая выглядит так
someline abc
someother line
name my_user_name is valid
some more lines
Я хочу извлечь слово «my_user_name». Я делаю что-то вроде
import re
s = #that big string
p = re.compile("name .* is valid", re.flags)
p.match(s) #this gives me <_sre.SRE_Match object at 0x026B6838>
Как мне теперь извлечь my_user_name?
group(0)
первый матч?group(0)
возвращает совпавший текст, а не первую группу захвата. Комментарий кода правильный, хотя вы, кажется, путаете группы захвата и совпадения.group(1)
возвращает первую группу захвата.NameError: name '_' is not defined
_ = p.search(s)
. Я вижу, что упоминается установка результата,_
но код этого не отражает. Я изменил_ = p.search(s)
на эту вторую строку, и она работает._
. Он не действует за пределами другого места.Вы можете использовать соответствующие группы:
например
Здесь я использую,
re.findall
а неre.search
получаю все экземплярыmy_user_name
. Используяre.search
, вам нужно будет получить данные из группы по объекту соответствия:Как упоминалось в комментариях, вы можете сделать свое регулярное выражение не жадным:
только подбирать материал между
'name '
и следующим' is valid'
(вместо того, чтобы позволить вашему регулярному выражению подбирать другое' is valid'
в вашей группе.источник
(.*?)
? Да, это возможно, хотя и не обязательно, если мы не используем OPre.DOTALL
re.findall('name (.*) is valid', 'name jon clements is valid is valid is valid')
вероятно, не даст желаемых результатов ....group
, точно такая же, как и в ответе, который вы приняли ...Вы можете использовать что-то вроде этого:
источник
Может быть, это немного короче и проще для понимания:
источник
Вам нужна группа захвата .
источник
Вы можете использовать группы (обозначенные значком
'('
и')'
) для захвата частей строки. Затемgroup()
метод объекта match выдает вам содержимое группы:В Python 3.6+ вы также можете индексировать объект соответствия вместо использования
group()
:источник
Вот способ сделать это без использования групп (Python 3.6 или выше):
источник
Вы также можете использовать группу захвата
(?P<user>pattern)
и обращаться к ней как к словарюmatch['user']
.источник
Похоже, вы на самом деле пытаетесь извлечь название, просто найдите совпадение. В этом случае полезно иметь индексы диапазона для вашего соответствия, и я бы рекомендовал использовать
re.finditer
. В качестве ярлыка вы знаете, чтоname
часть вашего регулярного выражения имеет длину 5 иis valid
длину 9, поэтому вы можете нарезать соответствующий текст, чтобы извлечь имя.Примечание. В вашем примере это выглядит как
s
строка с разрывами строки, что и предполагается ниже.источник