擅长:python、mysql、java
<p>我会这样做:</p>
<pre><code>import re
reg = re.compile(r'-agent-(?P<city>[^-]*)(?:-(?P<state>[^-]*))?-\d')
checkstr = 'http://www.trulia.com/profile/agent-name-agent-orlando-fl-24408364/'
m = reg.search(checkstr)
city = m.group('city').title()
state = m.group('state').upper() if (m.group('state')) else ''
print city, state
</code></pre>
<p>如果需要多次使用该模式,可以使用<code>re.compile</code>一次性编译它</p>
<p>我没有使用<code>.*</code>这是非常宽容的,并生成回溯,而是使用<code>[^-]*</code><em>(所有这些都不是零次或多次破折号)</em>,在第一个破折号之前停止。你知道吗</p>
<p>状态和前面的破折号位于可选组:<code>(?:-(?P<state>[^-]*))?</code>。因此,即使字符串没有状态部分,模式也会成功。你知道吗</p>
<p>有了这个更改<code>re.findall</code>就不再需要了,您可以使用<code>re.search</code>返回一个结果。请注意,如果您不确定字符串格式,则始终可以添加测试以检查是否存在匹配项。你知道吗</p>
<p>为了使代码更具可读性,我使用命名的captures<code>(?P<name>...)</code>。因此,通过这种方式,您可以轻松地检索组的内容:<code>m.group('name')</code>。但是,如果您想稍微提高速度,可以使用数字组(但这不是很重要)。你知道吗</p>