Проблема регулярного выражения Python - PullRequest
1 голос
/ 05 февраля 2010

Что я пытаюсь сделать: разобрать запрос на ведущий или трейлинг? что приведет к поиску по оставшейся части строки.

"Foobar?" или "? foobar" приводит к поиску. «foobar» приводит к другому поведению.

Этот код работает так, как и ожидалось в интерпретаторе:

 >>> import re
 >>> print re.match(".+\?\s*$","foobar?")
 <_sre.SRE_Match object at 0xb77c4d40>
 >>> print re.match(".+\?\s*$","foobar")
 None

Этот код из приложения Django не:

doSearch = { "text":"Search for: ", "url":"http://www.google.com/#&q=QUERY", "words":["^\?\s*",".+\?\s*$"] }
...
subQ = myCore.lookForPrefix(someQuery, doSearch["words"])
...
def lookForPrefix(query,listOfPrefixes):
    for l in listOfPrefixes:
        if re.match(l, query):
            return re.sub(l,'', query)
    return False

Код Django никогда не соответствует завершающему "?", Все остальные регулярные выражения работают нормально.

А идеи о том, почему нет?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2010

Проблема в вашем втором регулярном выражении. Он соответствует всему запросу, поэтому использование re.sub() заменит все это пустой строкой. То есть lookForPrefix('foobar?',listOfPrefixes) вернет ''. Вероятно, вы проверяете возвращаемое значение в if, поэтому он оценивает пустую строку как ложную.

Чтобы решить эту проблему, вам просто нужно изменить второе регулярное выражение на \?\s*$ и использовать re.search() вместо re.match(), так как последний требует, чтобы ваше регулярное выражение совпадало с начала строки.

doSearch = { "text":"Search for: ", "url":"http://www.google.com/#&q=QUERY", "words":["^\?\s*","\?\s*$"] }

def lookForPrefix(query,listOfPrefixes):
    for l in listOfPrefixes:
        if re.search(l, query):
            return re.sub(l,'', query)
    return False

Результат:

>>> lookForPrefix('?foobar', doSearch["words"])
'foobar'
>>> lookForPrefix('foobar?', doSearch["words"])
'foobar'
>>> lookForPrefix('foobar', doSearch["words"])
False

РЕДАКТИРОВАТЬ: На самом деле, вы могли бы также объединить два регулярных выражения в одно: ^\?\s*|\?\s*$. Это будет работать одинаково хорошо.

0 голосов
/ 05 февраля 2010

Возможно, вы хотите использовать необработанные строки для регулярных выражений, например: r '^ \ s \?'. Обычные строки предотвращают возникновение проблем, когда экранированные символы становятся другими значениями (r '\ 0' совпадает с '\ 0', но отличается от '\ 0' (один нулевой символ)).

Также r '^ \? \ S * | \? \ S * $' будет НЕ работать так, как задумал Макс С., потому что | чередуется между "\ s * и \?". Регулярное выражение, предлагаемое в EDIT, интерпретирует: знак вопроса в начале строки, за которым следует любое количество пробелов ИЛИ знак вопроса, за которым следует любое число пробелы и конец строки.

Я полагаю, Макс С. намеревался: r '(^ \? \ S *) | (\? \ S * $)', что означает: знак вопроса, за которым следует любое количество пробелов в начале или конце линия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...