Python извлечь шаблон соответствует
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 сейчас?
5 ответов:
вам нужно захватить от regex.
searchдля шаблона, если он найден, извлеките строку с помощьюgroup(index). Предполагая, что выполняются допустимые проверки:>>> p = re.compile("name (.*) is valid") >>> p.search(s) # The result of this is referenced by variable name '_' <_sre.SRE_Match object at 0x10555e738> >>> _.group(1) # group(1) will return the 1st capture. 'my_user_name'
вы можете использовать соответствующие группы:
p = re.compile('name (.*) is valid')например
>>> import re >>> p = re.compile('name (.*) is valid') >>> s = """ ... someline abc ... someother line ... name my_user_name is valid ... some more lines""" >>> p.findall(s) ['my_user_name']здесь я использую
re.findall, а неre.searchчтобы получить все экземплярыmy_user_name. Используяre.search, вам нужно будет получить данные из группы на объекте match:>>> p.search(s) #gives a match object or None if no match is found <_sre.SRE_Match object at 0xf5c60> >>> p.search(s).group() #entire string that matched 'name my_user_name is valid' >>> p.search(s).group(1) #first group that match in the string that matched 'my_user_name'
как уже упоминалось в комментариях, вы можете сделать свое регулярное выражение не жадным:
p = re.compile('name (.*?) is valid')чтобы только забрать вещи между
'name 'и далее' is valid'(вместо того, чтобы позволять вашей регулярное выражение, чтобы забрать другие' is valid'в вашей группе.
вы могли бы использовать что-то вроде этого:
import re s = #that big string # the parenthesis create a group with what was matched # and '\w' matches only alphanumeric charactes p = re.compile("name +(\w+) +is valid", re.flags) # use search(), so the match doesn't have to happen # at the beginning of "big string" m = p.search(s) # search() returns a Match object with information about what was matched if m: name = m.group(1) else: raise Exception('name not found')
вы хотите группа захвата.
p = re.compile("name (.*) is valid", re.flags) # parentheses for capture groups print p.match(s).groups() # This gives you a tuple of your matches.
может быть, это немного короче и понятнее:
import re text = '... someline abc... someother line... name my_user_name is valid.. some more lines' >>> re.search('name (.*) is valid', text).group(1) 'my_user_name'
Comments