<p>您可以使用2个具有lookarounds的捕获组,在替换中使用lambda来检查哪个组匹配</p>
<p>如果组1匹配,则删除最后一个字符。如果组2匹配,则附加连字符</p>
<pre><code>([A-Z]-(?=[A-Z]))|([A-Z](?=[0-9])|[0-9](?=[A-Z]))
</code></pre>
<p><em>解释</em></p>
<ul>
<li><code>(</code>捕获<strong>组1</strong>
<ul>
<li><code>[A-Z]-(?=[A-Z])</code>匹配A-Z和-并断言右边的是A-Z</li>
</ul></li>
<li><code>)</code>闭合群</li>
<li><code>|</code>或</li>
<li><code>(</code>捕获<strong>第2组</strong>
<ul>
<li><code>[A-Z](?=[0-9])</code>匹配A-Z并断言右边的是数字</li>
<li><code>|</code>或</li>
<li><code>[0-9](?=[A-Z])</code>匹配0-9并断言右边的是A-Z</li>
</ul></li>
<li><code>)</code>闭合群</li>
</ul>
<p><a href="https://regex101.com/r/g0RDW7/1" rel="nofollow noreferrer">Regex demo</a><a href="https://ideone.com/UPNSR2" rel="nofollow noreferrer">Python demo</a></p>
<p><em>示例代码</em></p>
<pre><code>import re
pattern = r"([A-Z]-(?=[A-Z]))|([A-Z](?=[0-9])|[0-9](?=[A-Z]))"
strings = [
"A-BA",
"A-B-BAB",
"9AHYA7",
"977AB99T5",
"HS98743YVJUHGF78BF8HH3JHFC83438VUN5498FCNG",
"7267-VHSBVH8737HHC8C-HYHFWYFHH-7Y84743YR8437G"
]
for str in strings:
result = re.sub(
pattern,
lambda x: x.group(1)[:-1] if x.group(1) else x.group(2) + "-",
str
)
print(result)
</code></pre>
<p><em>输出</em></p>
<pre><code>ABA
ABBAB
9-AHYA-7
977-AB-99-T-5
HS-98743-YVJUHGF-78-BF-8-HH-3-JHFC-83438-VUN-5498-FCNG
7267-VHSBVH-8737-HHC-8-CHYHFWYFHH-7-Y-84743-YR-8437-G
</code></pre>