<p>我将使用以下方法:</p>
<pre><code>regex = re.compile(r"\b10\.(?:(?!\b11\.|\bpH\b).)*\bpH\b\s*(\d+(?:[.,]\d+)?)(?=.*\b11\.)", re.DOTALL)
pH = regex.search(my_string).group(1)
</code></pre>
<p>测试它<a href="https://regex101.com/r/eV1vZ7/1" rel="nofollow">live on regex101.com</a>。你知道吗</p>
<p>它只匹配pH值,如果它在<code>10.</code>和<code>11.</code>之间,如果有多个pH值,它会找到第一个pH值。你知道吗</p>
<p><strong>说明:</strong></p>
<pre class="lang-none prettyprint-override"><code>\b10\. # Match 10. (but not 110.)
(?: # Start of a (repeating) group that matches...
(?! # (if we're not at the start of either...
\b11\. # the number 11.
| # or
\bpH\b # the string pH
) # )
. # any character (including newlines, therefore the DOTALL option).
)* # Repeat as necessary.
\bpH\b # Match the string pH
\s* # Match optional whitespace
( # Match and capture in group 1:
\d+ # At least one digit
(?:[.,]\d+)? # optionally followed by a decimal part
) # End of capturing group
(?= # Assert that the following can be matched afterwards:
.* # any number of characters
\b11\. # followed by 11.
) # End of lookahead assertion.
</code></pre>