擅长:python、mysql、java
<p>使用lookahead(解释如下)预编译regex模式,并在列表中使用<code>regex.match</code>:</p>
<pre><code>>>> import re
>>> p = re.compile(r'\D+?(?=\s*([A-Z]{2})?\s*\d)')
>>> [p.match(x).group() for x in data]
</code></pre>
<p/>
<pre><code>[
'Tortillas Bolsa',
'Tortillinas',
'Bollos',
'Super Pan Bco Ajonjoli',
'Pan Blanco Bimbo Rendidor',
'Gansito'
]
</code></pre>
<p>这里,<code>data</code>是字符串列表。你知道吗</p>
<p><strong>细节</strong></p>
<pre><code>\D+? # anything that isn't a digit (non-greedy)
(?= # regex-lookahead
\s* # zero or more wsp chars
([A-Z]{2})? # two optional uppercase letters
\s*
\d # digit
)
</code></pre>
<hr/>
<p>如果任何字符串不包含您要查找的模式,列表理解将出错(带有AttributeError),因为在该实例中<code>re.match</code>返回<code>None</code>。然后可以使用循环并在提取匹配部分之前测试<code>re.match</code>的值。你知道吗</p>
<pre><code>matches = []
for x in data:
m = p.match(x)
if m:
matches.append(m.group())
</code></pre>
<p>或者,如果不匹配时需要占位符<code>None</code>:</p>
<pre><code>matches = []
for x in data:
matches.append(m.group() if m else None)
</code></pre>