<p>更有效的模式可能是匹配字符串开头的非数字</p>
<p>然后捕获组1<em>(将用于新列)中的第一个数字</em>,并进行匹配,直到第一次遇到管道<code>|</code>,而不是使用前瞻</p>
<pre><code>\A\D*(\d+)[^|]*\|
</code></pre>
<ul>
<li><code>\A</code>字符串的开头</li>
<li><code>\D*</code>匹配可选的非数字</li>
<li><code>(\d+)</code>捕获组1,匹配1+个数字</li>
<li><code>[^|]*\|</code>匹配除<code>|</code>之外的任何字符,然后匹配<code>|</code></li>
</ul>
<p><a href="https://regex101.com/r/RoHS8L/1" rel="nofollow noreferrer">Regex demo</a></p>
<p>示例代码</p>
<pre><code>import pandas as pd
strings = ['S10|1828575',
'S10|1828575',
'S10|1828575',
'S10|1828575',
'SA510KPBF|47010705',
'SA510KPBF|47010705',
'SABLF|47009610',
'SABLF|47009610',
'SABLF|47009610']
df = pd.DataFrame(strings, columns=["str_values"])
df['first_numeric'] = df["str_values"].str.extract(r'\A\D*(\d+)[^|]*\|')
print(df)
</code></pre>
<p>输出</p>
<pre><code> str_values first_numeric
0 S10|1828575 10
1 S10|1828575 10
2 S10|1828575 10
3 S10|1828575 10
4 SA510KPBF|47010705 510
5 SA510KPBF|47010705 510
6 SABLF|47009610 NaN
7 SABLF|47009610 NaN
8 SABLF|47009610 NaN
</code></pre>