<p>这段代码中经过修改的正则表达式就可以实现这个目的。这包括处理诸如“W of”、“at E”和类似的事情:</p>
<pre><code>import re
nameList = ['Boulder Highway and US 95 NB', 'Boulder Hwy and US 95 SB',
'Buffalo and Summerlin N', 'Charleston and I-215 W', 'Eastern and I-215 S', 'Flamingo and NB I-15',
'S Buffalo and Summerlin', 'Flamingo and SB I-15', 'Gibson and I-215 EB', 'I-15 at 3.5 miles N of Jean',
'I-15 NB S I-215 (dual)', 'I-15 SB 4.3 mile N of Primm', 'I-15 SB S of Russell', 'I-515 SB at Eastern W',
'I-580 at I-80 N E', 'I-580 at I-80 S W', 'I-80 at E 4TH St Kietzke Ln', 'I-80 East of W McCarran',
'LV Blvd at I-215 S', 'S Buffalo and I-215 W', 'S Decatur and I-215 WB', 'Sahara and I-15 East',
'Sands and Wynn South Gate', 'Silverado Ranch and I-15 (west side)']
dirMap = {'N': 'North', 'S': 'South', 'E': 'East', 'W': 'West'}
dirPattern = re.compile(r'(?:^| )(?<! at )(?<! of )([NSEW])B?(?! of )(?: |$)')
print('name\tdirSting\tdirection')
for name in nameList:
match = dirPattern.search(name)
direction = None
dirString = None
if match:
dirString = match.group(1)
direction = dirMap.get(dirString)
print('> %s\t\t%s\t%s'%(name, dirString, direction))
</code></pre>
<p>正则表达式可以理解为:</p>
<p><code>(?:^| )</code>以字符串开头或空格开头</p>
<p><code>(?<! at )</code>前面没有“at”</p>
<p><code>(?<! of )</code>前面没有'of'</p>
<p><code>([NSEW])</code>“N”、“S”、“E”、“W”中的任意一个(这将在匹配.组(1) ()</p>
<p><code>B?</code>可选地后跟“B”(如在绑定中)</p>
<p><code>(?! of )</code>后面不跟“at”</p>
<p><code>(?: |$)</code>以字符串或空格结尾</p>
<p>最终输出为:</p>
<blockquote>
<p>Boulder Highway and US 95 NB N North</p>
<p>Boulder Hwy and US 95 SB S South</p>
<p>Buffalo and Summerlin N N North</p>
<p>Charleston and I-215 W W West</p>
<p>Eastern and I-215 S S South</p>
<p>Flamingo and NB I-15 N North</p>
<p>S Buffalo and Summerlin S South</p>
<p>Flamingo and SB I-15 S South</p>
<p>Gibson and I-215 EB E East</p>
<p>I-15 at 3.5 miles N of Jean None None</p>
<p>I-15 NB S I-215 (dual) N North</p>
<p>I-15 SB 4.3 mile N of Primm S South</p>
<p>I-15 SB S of Russell S South</p>
<p>I-515 SB at Eastern W S South</p>
<p>I-580 at I-80 N E N North</p>
<p>I-580 at I-80 S W S South</p>
<p>I-80 at E 4TH St Kietzke Ln None None</p>
<p>I-80 East of W McCarran None None</p>
<p>LV Blvd at I-215 S S South</p>
<p>S Buffalo and I-215 W S South</p>
<p>S Decatur and I-215 WB S South</p>
<p>Sahara and I-15 East None None</p>
<p>Sands and Wynn South Gate None None</p>
<p>Silverado Ranch and I-15 (west side) None None</p>
</blockquote>
<p>旁注:我决定我不想要结束字符串的情况。为此,正则表达式应该是:</p>
<p><code>dirPattern = re.compile(r'(?:^| )(?<! at )(?<! of )([NSEW])B? (?!of )')</code></p>