<p>你可以用</p>
<pre><code>\b([a-zA-Z]+)(?: [a-zA-Z]+%.*?)? (\d+(?:\.\d+)?)(?!\S)
</code></pre>
<ul>
<li><code>\b</code>防止部分匹配的单词边界</li>
<li><code>([a-zA-Z]+)</code>捕获<strong>组1</strong>,匹配1+char a-zA-Z</li>
<li><code>(?: [a-zA-Z]+%.*?)? </code>可选地匹配空格和字符a-z,后跟<code>%</code>和空格</li>
<li><code>(\d+(?:\.\d+)?)</code>捕获<strong>第2组</strong>,将1+个数字与可选的小数部分匹配</li>
<li><code>(?!\S)</code>在右边声明一个空白边界</li>
</ul>
<p><a href="https://regex101.com/r/wvNpod/1" rel="nofollow noreferrer">Regex demo</a></p>
<pre><code>import re
strings = [
"Fluid 13.4",
"Fluid 13.4 gm% fluid_haemo 12.0-14.0",
"Fluid gm% 13.4 fluid_haemo 12.0-14.0",
"Fluid gm% fluid_hameo 12.0-14.0 13.4"
]
pattern=r"\b([a-zA-Z]+)(?: [a-zA-Z]+%.*?)? (\d+(?:\.\d+)?)(?!\S)"
for s in strings:
print(re.findall(pattern, s))
</code></pre>
<p>输出</p>
<pre><code>[('Fluid', '13.4')]
[('Fluid', '13.4')]
[('Fluid', '13.4')]
[('Fluid', '13.4')]
</code></pre>
<p><strong>编辑</strong></p>
<p>要捕获第一组中包含的“单词”,您可以选择包含重复匹配的空格,后跟1+倍的任何允许字符,这些字符以右边的whitspace边界结尾</p>
<pre><code>\b([A-Za-z]+\b(?:\s+[\w()]+)*(?!\S)).*?\s(\d+(?:\.\d+)?)(?!\S)
</code></pre>
<ul>
<li><code>\b</code>防止部分匹配的单词边界</li>
<li><code>(</code>捕获<strong>组1</strong>
<ul>
<li><code>[A-Za-z]+\b</code>匹配1+字符A-Za-z和单词边界</li>
<li><code>(?:\s+[\w()]+)*</code>可选地重复空格字符,后跟字符类中任何允许字符的1+倍</li>
<li><code>(?!\S)</code>在右边声明一个空白边界</li>
</ul>
</li>
<li><code>)</code>关闭组1</li>
<li><code>.*?\s</code>匹配尽可能少的字符,然后再匹配一个空白字符</li>
<li><code>(</code>捕获<strong>第2组</strong>
<ul>
<li><code>\d+(?:\.\d+)?</code></li>
</ul>
</li>
<li><code>)</code>关闭组2</li>
<li><code>(?!\S)</code>在右边声明一个空白边界</li>
</ul>
<p><a href="https://regex101.com/r/iyLLu6/1" rel="nofollow noreferrer">Regex demo</a></p>