2

我正在为经验和知识编写一个搜索引擎。现在,我正在构建一个爬虫及其附带的实用程序。其中之一是 URL 规范化器。这就是我现在正在尝试构建的内容,更具体地说,我被困在我必须制定一种方法来获取 url,并将“%”符号后面的字母大写的地方。到目前为止我的代码:

def escape_sequence_capitalization(url):
        ''' The method that capitalizes letters in escape sequences.
        All letters within a percent - encoding triplet (e.g. '%2C') are case
        insensitive and should be capitalized.

        '''
    next_encounter = None
    url_list = []
    while True:
        next_encounter = url.find('%')
        if next_encounter == -1:
            break

        for letter in url[:next_encounter]:
            url_list.append(letter)

        new_character = url[next_encounter + 1].upper()
        url_list.append(new_character)
        url = url[next_encounter:]

    for letter in url:
        url_list.append(letter)

    return ''.join(url_list)

有人可以指导我发现我的错误在哪里吗?我将感激不尽。谢谢你。

编辑:这就是我想要实现的目标:

http://www.example.com/a%c2%b1b → http://www.example.com/a%C2%B1b
4

4 回答 4

10

通过静态分析,它永远循环,因为你while True永远不会中断。那么它在哪里可以打破呢?仅在break语句中仅当next_encounter等于 -1 时;所以你可以推断它永远不会。

为什么不呢?试一试。print next_encounter_ url.find你很快就会看到

url = url[next_encounter:]

几乎完成了您希望的工作,只是它给您的角色比您希望的多一个。

为什么我以这种方式呈现它?主要是因为print学习语言的人经常低估 的价值。

于 2012-07-14T18:22:27.690 回答
4

@msw 做到了,并给出了合理的建议。

我的 $.02 是你永远不应该尝试这个循环

怎么样:

>>> re.sub('%..',lambda m: m.group(0).upper(),'http://www.example.com/a%c2%b1b')
'http://www.example.com/a%C2%B1b'
于 2012-07-14T18:34:31.810 回答
3

这就是为什么:

>>> 'asd'.find('s')
1
>>> 'asd'[1:]
'sd'

另外,考虑使用第二个参数来str.find()代替切片。

于 2012-07-14T18:21:34.027 回答
1

我参加聚会有点晚了,但是您可能要考虑使用正则表达式而不是如此复杂的函数:

>>> import re
>>> url = "http://www.example.com/a%c2%b1b"
>>> result = re.sub("(?i)%[0-9A-F]{2}", lambda x: x.group(0).upper(), url)
>>> result
'http://www.example.com/a%C2%B1b'

解释:

(?i)          # Make regex case-insensitive
%             # Match a %
[0-9A-F]{2}   # Match two hex digits

re.sub() finds all these occurrences in the string and passes the result (the match object's group(0)) to the .upper() method, then replaces the original with the uppercased version of the match.

于 2012-07-15T07:27:17.690 回答