擅长:python、mysql、java
<p>像这样的?你知道吗</p>
<pre><code>pattern = r'(\(?(\d{3})\)?(?P<A>-)?(\d{3})(?(A)-?|-)(\d{4}))'
</code></pre>
<p>使用它:</p>
<pre><code>import re
regex = re.compile(pattern)
check = ['123-333-1111', '(123)111-2222', '123-2221111', '1232221111']
for number in check:
match = regex.match(number)
print number, bool(match)
if match:
# show the numbers
print 'nums:', filter(lambda x: x and x.isalnum(), match.groups())
>>>
123-333-1111 True
nums: ('123', '333', '1111')
(123)111-2222 True
nums: ('123', '111', '2222')
123-2221111 True
nums: ('123', '222', '1111')
1232221111 False
</code></pre>
<hr/>
<p><strong>注意:</strong></p>
<p>您要求解释:<code>(?P<A>-)</code>和<code>(?(A)-?|-)</code></p>
<ul>
<li><code>(?P<A>-)</code>:是一个名为<code>A</code>,<code>(?P<NAME> ... )</code>的命名捕获组</li>
<li><code>(?(A)-?|-)</code>:检查命名组<code>A</code>是否捕获了某些内容的组,如果捕获了,则执行YES,否则执行NO捕获。<code>(?(NAME)YES|NO)</code></li>
</ul>
<p>如果您在Python解释器中执行一个简单的<code>help(re)</code>,或者在Google中搜索Python正则表达式,那么所有这些都很容易学会。。。。你知道吗</p>