В python как преобразовать тип соответствия регулярного выражения (sre.SRE_Match) в FLOATS? [Дубликат]

Он позволяет более эффективно находить исходные файлы ( .java) и скомпилированные ( .class) файлы во время компиляции (директива import) и более эффективную загрузку классов во время выполнения. Идея заключается в том, что, если вы знаете имя класса, вы знаете, где он должен быть найден для каждой записи пути к классу. Не требуется индексация.

49
задан Kannan Ekanath 11 March 2013 в 18:05
поделиться

5 ответов

Вам нужно захватить из регулярного выражения. 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'
63
ответ дан UltraInstinct 16 August 2018 в 01:34
поделиться
  • 1
    Вы уверены, что это не group(0) для первого матча? – sharshofski 16 April 2015 в 14:04
  • 2
    Вид поздно, но и да, и нет. group(0) возвращает согласованный текст, а не первую группу захвата. Комментарий к коду правильный, в то время как вы, кажется, путаете группы захвата и совпадения. group(1) возвращает первую группу захвата. – andrewgu 7 August 2015 в 01:31

Вы можете использовать что-то вроде этого:

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')
12
ответ дан Apalala 16 August 2018 в 01:34
поделиться

Вы хотите группу захвата .

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.
7
ответ дан Henry Keiter 16 August 2018 в 01:34
поделиться

Возможно, это немного короче и понятнее:

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'
3
ответ дан John 16 August 2018 в 01:34
поделиться

Вы можете использовать соответствующие группы:

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, вам нужно будет получить данные из группы в объекте совпадения:

>>> 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' в вашей группе.

28
ответ дан mgilson 16 August 2018 в 01:34
поделиться
  • 1
    Возможно, требуется не-жадное совпадение ... (если имя пользователя не может быть несколько слов ...) – Jon Clements♦ 11 March 2013 в 16:10
  • 2
    @JonClements - Вы имеете в виду (.*?)? Да, это возможно, хотя и не обязательно, если мы не используем re.DOTALL – mgilson 11 March 2013 в 16:11
  • 3
    да - re.findall('name (.*) is valid', 'name jon clements is valid is valid is valid'), вероятно, не даст желаемых результатов ... – Jon Clements♦ 11 March 2013 в 16:13
  • 4
    Это не работает для Python 2.7.1? Он просто печатает объект шаблона? – Kannan Ekanath 11 March 2013 в 18:06
  • 5
    @CalmStorm - какая часть не работает (я тестировал на python2.7.3)? Часть, в которой я использую .group, точно такая же, как и принятый вами ответ ... – mgilson 11 March 2013 в 19:07
Другие вопросы по тегам:

Похожие вопросы: