<p>这种方法使用<strong>regex</strong>和命名捕获组来查找和提取感兴趣的字符串,只需两行代码</p>
<h3>regex对<code>split</code>:</h3>
<p>的确,不需要正则表达式。然而,从数据验证的角度来看,使用正则表达式有助于防止“散乱”数据悄悄进入。使用'blind'<code>split()</code>函数拆分(字符)上的数据;但如果源数据发生了变化怎么办?拆分函数对此视而不见。然而,使用正则表达式将有助于突出一个问题,因为模式根本不匹配。是的,您可能会收到一条错误消息,但这是一件好事,因为您将收到数据格式更改的警报,从而有机会解决问题或更新正则表达式模式</p>
<p>此外,regex提供了一个健壮的解决方案,因为模式匹配整个字符串,并且忽略此模式之外的任何内容—如问题中提到的示例</p>
<p>如果您想对regex模式本身进行一些解释,只需添加一条注释,我将更新答案以进行解释</p>
<h3>样本数据:</h3>
<pre><code> test_no
0 TP-ETU05-01-525-W-005
1 TP-ETU06-01-525-W-006
2 TP-ETU07-01-525-W-007
3 TP-ETU08-01-525-W-008
4 TP-ETU09-01-525-W-009
5 NaN
6 NaN
7 otherstuff
</code></pre>
<h3>代码:</h3>
<pre><code>import re
exp = re.compile(r'^[A-Z]{2}-(?P<sys_no>[A-Z]{3}\d{2})-\d{2}-\d{3}-[A-Z]-(?P<package_no>\d{3})$')
df[['sys_no', 'package_no']] = df['test_no'].str.extract(exp, expand=True)
</code></pre>
<h3>输出:</h3>
<pre><code> test_no sys_no package_no
0 TP-ETU05-01-525-W-005 ETU05 005
1 TP-ETU06-01-525-W-006 ETU06 006
2 TP-ETU07-01-525-W-007 ETU07 007
3 TP-ETU08-01-525-W-008 ETU08 008
4 TP-ETU09-01-525-W-009 ETU09 009
5 NaN NaN NaN
6 NaN NaN NaN
7 otherstuff NaN NaN
</code></pre>