<p>您可以使用以下方式获得公寓号码:</p>
<pre><code>^\d+|\bNo\s*\d+
</code></pre>
<p>见<a href="https://regex101.com/r/eCrj9V/1" rel="nofollow noreferrer">regex demo</a>。<code>^\d+|\bNo\s*\d+</code>正则表达式匹配字符串开头的一个或多个数字,或者<code>No</code>,零个或多个空格,然后匹配一个或多个数字</p>
<p>要捕获街道信息,可以使用</p>
<pre><code>^\d+,?\s*(.*)|^(.*?)\s+No\s*\d+
</code></pre>
<p>见<a href="https://regex101.com/r/eCrj9V/2" rel="nofollow noreferrer">this regex demo</a>。详情:</p>
<ul>
<li><code>^\d+,?\s*(.*)</code>-字符串的开头,一个或多个数字,可选的逗号,0+空格,然后是除换行符以外的任何零个或多个字符,尽可能多地捕获到组1中</li>
<li><code>|</code>-或</li>
<li><code>^(.*?)\s+No\s*\d+</code>-字符串的开头,除换行符以外的任何零个或多个字符尽可能多地捕获到组2、1+空格、<code>No</code>、0+空格,然后是1+数字中</李>
</ul>
<p>在Python中,永远不要在<code>for</code>循环中编译regexp,请在编译之前进行。见<a href="https://ideone.com/zA3Sgr" rel="nofollow noreferrer">Python demo</a>:</p>
<pre><code>import re
pattern_aptnum = re.compile(r'^\d+|\bNo\s*\d+')
pattern_street = re.compile(r'^\d+,?\s*(.*)|^(.*?)\s+No\s*\d+')
for i in ["32 Syndicate street","Street 45 No 100","15, Tom and Jerry Street"]:
fin_street = ""
fin_aptnum = ""
print("String:", i)
match_street = pattern_street.search(i)
if match_street:
fin_street = match_street.group(1) or match_street.group(2)
match_aptnum = pattern_aptnum.search(i)
if match_aptnum:
fin_aptnum = match_aptnum.group()
print("street ",fin_street)
print("apartmentnumber ",fin_aptnum)
</code></pre>
<p>输出:</p>
<pre><code>String: 32 Syndicate street
street Syndicate street
apartmentnumber 32
String: Street 45 No 100
street Street 45
apartmentnumber No 100
String: 15, Tom and Jerry Street
street Tom and Jerry Street
apartmentnumber 15
</code></pre>