私はPythonを初めて使用します。何を探すべきかわかりませんが、調査を行ったにもかかわらず、この単純な問題に対してかなり醜い20行のコードブロックを思いついたことを保証します。
Pyramid フレームワークに基づくアプリでトラバーサル URL を処理しています。
現在、URL は次のようになります: (url = None)
- URL = ""
- URL = "/"
- URL = "/block_1"
- URL = "/block_1/"
- URL = "/block_1/block_2"
- 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
私のコードがひどいもので、複雑すぎる場合は申し訳ありません。これを行うためのよりエレガントでより良い方法があれば幸いです。
どうすればそれができますか?この詰まったコード行を取り除くにはどうすればよいですか?
ありがとうございました。