Почему регулярное выражение возвращает ошибку в python? - PullRequest
3 голосов
/ 05 марта 2009

Я пытаюсь использовать следующее регулярное выражение в python, но оно возвращает ошибку

import re
...

#read a line from a file to variable line
# loking for the pattern 'WORD' in the line ...

m=re.search('(?<=[WORD])\w+',str(line))
m.group(0)

я получаю следующую ошибку:

AttributeError: у объекта 'NoneType' нет атрибута 'group'

Ответы [ 5 ]

5 голосов
/ 05 марта 2009

Это происходит потому, что регулярное выражение не соответствует. Следовательно, m - Нет, и, конечно, вы не можете получить доступ к группе [0]. Прежде чем пытаться получить доступ к членам группы, необходимо сначала проверить успешность поиска.

3 голосов
/ 05 марта 2009

Два выпуска:

  1. ваш шаблон не соответствует, поэтому m имеет значение None, а None не имеет атрибута group.

  2. Я полагаю, вы имели в виду либо:

    m= re.search(r"(?<=WORD)\w+", str(line))
    

    как введено, или

    m= re.search(r"(?P<WORD>\w+)", str(line))
    

    Первый соответствует «abc» в «WORDabc def»; последний соответствует «abc» в «abc def», и объект соответствия будет иметь .group("WORD"), содержащий «abc». (Использование строк r "" обычно является хорошей идеей при указании регулярных выражений.)

2 голосов
/ 05 марта 2009
>>> help(re.search)
Help on function search in module re:

search(pattern, string, flags=0)
    Scan through string looking for a match to the pattern, returning
    a match object, or None if no match was found.

Посмотрите на последнюю строку: возвращает None, если совпадений не найдено

2 голосов
/ 05 марта 2009

в документации по поиску говорится :

Возврат Нет , если ни одна позиция в строке не соответствует шаблону; обратите внимание, что это отличается от поиска совпадения нулевой длины в некоторой точке строки.

1 голос
/ 05 марта 2009

Кстати, ваше регулярное выражение неверно. Если вы ищете «СЛОВО», это должно быть просто «СЛОВО». str тоже посторонний. Ваш код должен выглядеть так:

m = re.search('WORD', line)
if m:
    print m.group[0]

Ваше оригинальное регулярное выражение выдаст, вероятно, неожиданные и нежелательные результаты:

>>> m = re.search('(?<=[WORD])\w+', 'WORDnet')
>>> m.group(0)
'ORDnet'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...