<p><em>我是Python新手,我不确定我应该寻找什么,但我向您保证,我已经做了我的研究,仍然为这个简单的问题提出了一个相当难看的20行长的代码块。</em></p>
<p>我正在处理一个基于金字塔框架的应用程序遍历URL。在</p>
<p>现在,URL可以是:(URL=None)</p>
<ol>
<li>url=“”</li>
<li>url=“/”</li>
<li>url=“/block_1”</li>
<li>url=“/block_1/”</li>
<li>url=“/block_1/block_2”</li>
<li>url=“/block_1/block_2/”</li>
</ol>
<p>url不能包含任何内容。在本例中,我希望函数返回False、None或空列表或元组。(不重要。)(匹配选项0或1)</p>
<p>块1:这是一个单字,a到Z字符串。不能也不应该包含任何特殊字符。实际上,作为块1,<strong>获取的内容应该在字典</strong>中(或列表中),如果找不到,则应引发并返回一个错误。如果块“1”不存在或找不到,则函数(如上所述)应返回False、None或empty list或tuple。(匹配选项2和3)</p>
<p>块2:块2可以是任何东西。为了简单起见,它可以包含任何语言的任何字符以及特殊字符,例如:()[]。如果我弄错了,请原谅,但我认为我想要的基本上是让它匹配<code>[\pL\pN].*</code>,但有一个例外:它的最后一个字符不能是斜杠:既不是<code>"\"</code>也不是{<cd3>}。最好,我希望它是<code>a to Z (including all languages' alphabets and their accented characters) along with some other characters from a list</code>(我在上面特别定义了:()和[])。如果块2没有给定,它应该有值None,如果不匹配,它应该返回False。(匹配上面列出的最后两个选项)</p>
<p>我的代码以一个非常原始的代码开头,对此我深表歉意:</p>
<pre><code>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
</code></pre>
<p>如果我的代码很糟糕而且过于复杂,我很抱歉。我最喜欢的就是一个更优雅更好的方法。在</p>
<p>那我该怎么做呢?我该怎么做才能消除这些被卡住的代码行?在</p>
<p>谢谢。在</p>