2

私は経験と知識のための検索エンジンを書いているところです。現在、クローラーとそれに付随するユーティリティを作成中です。これらの 1 つが 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決して壊れないため、永遠にループします。では、どこが壊れやすいのでしょうか?が -1 に等しくなる場合に限り、breakステートメントでのみ。next_encounterしたがって、決してそうではないと推測できます。

なぜそうしないのですか?print next_encounterafter を試してくださいurl.find。あなたはすぐにそれを見るでしょう

url = url[next_encounter:]

はほとんど期待どおりの動作をしますが、期待したよりも 1 文字多いだけです。

なぜ私はそれをこのように提示したのですか?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()また、スライスの代わりに2 番目の引数を使用することを検討してください。

于 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()は、文字列内のこれらすべての出現箇所を検索し、結果 (一致オブジェクトのgroup(0)) を.upper()メソッドに渡し、元の一致を大文字バージョンに置き換えます。

于 2012-07-15T07:27:17.690 に答える