0

私はPythonを初めて使用します。何を探すべきかわかりませんが、調査を行ったにもかかわらず、この単純な問題に対してかなり醜い20行のコードブロックを思いついたことを保証します。

Pyramid フレームワークに基づくアプリでトラバーサル URL を処理しています。

現在、URL は次のようになります: (url = None)

  1. URL = ""
  2. URL = "/"
  3. URL = "/block_1"
  4. URL = "/block_1/"
  5. URL = "/block_1/block_2"
  6. url = "/block_1/block_2/"

URL に何も含めることはできません。この場合、関数が False、None、または空のリストまたはタプルを返すようにします。(どちらでも構いません。) (一致するオプション 0 または 1)

Block_1: これは 1 つの単語で、Z から Z までの文字列です。特殊文字を含めることはできません。実際、block_1 としてフェッチされたものは辞書(またはリスト) にある必要があり、見つからない場合はエラーが発生して返されます。block_1 が存在しないか見つからない場合、関数は、前述のように、False、None、または空のリストまたはタプルを返す必要があります。(一致するオプション 2 と 3)

Block_2: Block_2 は何でもかまいません。簡単にするために、()[] などの特殊文字とともに、任意の言語の任意の文字を含めることができます。私が間違っていたらすみませんが、私が望むのは基本的にそれが一致することだと思います[\pL\pN].*.1つの例外を除いて:その最後の文字はスラッシュのどちら"\"でもありません"/". できれば、a to Z (including all languages' alphabets and their accented characters) along with some other characters from a list(上記のように特別に定義します:()と[])。block_2 が指定されていない場合、値は None である必要があり、一致しない場合は False を返す必要があります。(上記の最後の 2 つのオプションに一致)

私のコードは、かなり原始的なもので始まります。

if not url: 
    return False
# then goes on evaluating the first charachter to see if it's a /
if fetch[0]  == '/':
    length = len(url)
    #then checks if there's a second / for the block_2
    slash_2 = fetch.find('/', 3) # or '/', 1
    if slash_2 == -1:
        block_1, block_2 = url[1:length].lower(), None
        # checks if block_1 is in a dictionary
        if not block_1 in the_dict:
            return False
    else: # if it's there it processes what's remaining
        block_1 = fetch[1:slash_2]
        block_2 = fetch[slash_2+1:]
        # then checks if there's another slash at the end of block_2
        if block_2[-1] == '/': # if so it removes it
            block_2 = block_2[:-1]
return False # otherwise returns false, which can be () or [] or None

私のコードがひどいもので、複雑すぎる場合は申し訳ありません。これを行うためのよりエレガントでより良い方法があれば幸いです。

どうすればそれができますか?この詰まったコード行を取り除くにはどうすればよいですか?

ありがとうございました。

4

2 に答える 2

4

split('/')必ず使用する必要があり、URL の解析に役立つはずです。

それが十分でない場合は、urlparse解析に使用する必要があります

urlparse.urlparse(path)
In [31]: url = 'http://stackoverflow.com/questions/12809298/how-can-i-separate-this-into-two-strings/12809315#12809315'

In [32]: urlparse.urlparse(url)
Out[32]: ParseResult(scheme='http', netloc='stackoverflow.com', path='/questions/12809298/how-can-i-separate-this-into-two-strings/12809315', params='', query='', fragment='12809315')

In [33]: a = urlparse.urlparse(url)

In [34]: a.path
Out[34]: '/questions/12809298/how-can-i-separate-this-into-two-strings/12809315'

In [35]: a.path.split('/')
Out[35]: 
['',
 'questions',
 '12809298',
 'how-can-i-separate-this-into-two-strings',
 '12809315']
于 2012-10-09T22:26:02.607 に答える
2

最初に試すのは.split()文字列関数です:

>>> url = "/block_1/block_2"
>>> url.split("/")
['', 'block_1', 'block_2']

これは、文字で区切られた文字列のコンポーネントのリストを返します/。そこから、len()関数を使用してリストの長さを確認し、目的のロジックに従って適切なアクションを実行できます。

于 2012-10-09T22:26:15.250 に答える