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 сейчас?

523   5  

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

    Ничего не найдено.