<p>您可以在组1中捕获1+个单词字符,然后使用<a href="https://www.regular-expressions.info/charclass.html" rel="nofollow noreferrer">character class</a>匹配空格和s或s</p>
<p>在替换中,在组1上使用<code>.title()</code>并添加<code>'s</code></p>
<pre><code>(?<!\S)(\w+) [sS](?!\S)
</code></pre>
<p><em>解释</em></p>
<ul>
<li><code>(?<!\S)</code>左空白边界</li>
<li><code>(\w+)</code>捕获组1,匹配1+单词字符</li>
<li><code> [sS]</code>匹配一个空格,然后<code>s</code>或<code>S</code></li>
<li><code>(?!\S)</code></li>
</ul>
<p><a href="https://regex101.com/r/pZqXrg/1" rel="nofollow noreferrer">Regex demo</a><a href="https://ideone.com/aF4Nx0" rel="nofollow noreferrer">Python demo</a></p>
<p><em>代码示例</em></p>
<pre><code>import re
test_str = "grace s"
regex = r"(?<!\S)(\w+) [sS](?!\S)"
result = re.sub(regex, lambda match: match.group(1).title()+"'s", test_str)
print(result)
</code></pre>
<p><em>输出</em></p>
<pre><code>Grace's
</code></pre>
<hr/>
<p>如果您想特别匹配<em>grace</em>,可以使用可选组。如果你想匹配更多的单词,你可以使用一个替代<code>(?:grace|anotherword)</code></p>
<pre><code>(?<!\S)(grace)(?: ([sS]))?\b
</code></pre>
<p><a href="https://regex101.com/r/i65VXK/1" rel="nofollow noreferrer">Regex demo</a></p>
<p><em>示例代码</em></p>
<pre><code>import re
test_str = "Her name is grace."
strings = [
"grace s",
"Her name is grace."
]
pattern = r"(?<!\S)(grace)(?: ([sS]))?\b"
regex = re.compile(pattern)
for s in strings:
print(
regex.sub(
lambda m: "{}{}".format(m.group(1).title(), "'s" if m.group(2) else '')
, s)
)
</code></pre>
<p><em>输出</em></p>
<pre><code>Grace's
Her name is Grace.
</code></pre>