1

我正在尝试做什么:解析查询以获取前导或尾随?这将导致对字符串的其余部分进行搜索。

“美食吧?” 或“?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 代码从不匹配尾随的“?”,所有其他正则表达式都可以正常工作。

为什么不呢?

4

2 回答 2

3

问题出在您的第二个正则表达式中。它匹配整个查询,因此 usingre.sub()会将其全部替换为空字符串。即lookForPrefix('foobar?',listOfPrefixes)会返回''。您可能正在检查 an 中的返回值if,因此它将空字符串评估为 false。

要解决这个问题,您只需将第二个正则表达式更改为\?\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*$. 这将同样有效。

于 2010-02-05T09:16:06.757 回答
0

您可能希望对正则表达式使用原始字符串,例如:r'^\s\?'。常规字符串将防止转义字符变成其他值的问题(r'\0' 与 '\0' 相同,但与 '\0' 不同(单个空字符))。

r'^\?\s*|\?\s*$' 也不会按 Max S. 的预期工作,因为 | 在 "\s* 和 \? 之间交替。编辑中提出的正则表达式解释为:行首的问号后跟任意数量的空格问号,后跟任意数量的空格和结尾线。

我相信 Max S. 的意图是:r'(^\?\s*)|(\?\s*$)',它解释为:一个问号,后跟在行首或行尾的任意数量的空格。

于 2010-02-05T14:31:47.947 回答