回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>以下输入条目列表</p>
<pre class="lang-py prettyprint-override"><code>l = ["555-8396 Neu, Allison",
"Burns, C. Montgomery",
"555-5299 Putz, Lionel",
"555-7334 Simpson, Homer Jay"]
</code></pre>
<p>预计将转变为:</p>
<pre><code>Allison Neu 555-8396
C. Montgomery Burns
Lionel Putz 555-5299
Homer Jay Simpson 555-7334
</code></pre>
<p>我尝试了以下方法:</p>
<pre class="lang-py prettyprint-override"><code>for i in l:
mo = re.search(r"([0-9]{3}-[0-9]{4})?\s*(\w*),\s*(\S.*$)", i)
if mo:
print("{} {} {}".format(mo.group(3), mo.group(2), mo.group(1)))
</code></pre>
<p>并导致以下错误输出(请注意输出的第二行中的“无”)</p>
<pre><code>Allison Neu 555-8396
C. Montgomery Burns None
Lionel Putz 555-5299
Homer Jay Simpson 555-7334
</code></pre>
<p>但是<a href="https://www.python-course.eu/python3_re.php" rel="nofollow noreferrer">e-book</a>中提到的以下解决方案确实提供了所需的输出:</p>
<pre class="lang-py prettyprint-override"><code>for i in l:
mo = re.search(r"([0-9-]*)\s*([A-Za-z]+),\s+(.*)", i)
print(mo.group(3) + " " + mo.group(2) + " " + mo.group(1))
</code></pre>
<p>简而言之,它归结为2个reg exp搜索的groups()输出的差异:</p>
<pre class="lang-py prettyprint-override"><code>>>> mo = re.search(r"([0-9]{3}-[0-9]{4})?\s*(\w*),\s*(\S.*$)", "Burns, C. Montgomery")
>>> mo.groups()
(None, 'Burns', 'C. Montgomery')
</code></pre>
<p>与</p>
<pre class="lang-py prettyprint-override"><code>>>> mo = re.search(r"([0-9-]*)\s*(\w*),\s*(\S.*$)", "Burns, C. Montgomery")
>>> mo.groups()
('', 'Burns', 'C. Montgomery')
</code></pre>
<p>无对“”</p>
<p>我想用[0-9]{3}-[0-9]{4}来更精确地匹配电话号码格式,而不是使用[0-9-]*来匹配任意数字和-组合(例如:“0-1-2”或“1-23”)。你知道吗</p>
<p>为什么“*”会导致与“?”不同的分组。
是的,在打印结果时处理“无”对我来说是微不足道的,但是我很想知道分组结果差异的原因。你知道吗</p>