擅长:python、mysql、java
<p>如果你有奇数个中文“单词”,你的模式应该考虑重叠匹配。使用lookaheads:</p>
<pre><code>re.sub(r'(?i)[A-Z]*[\u4300-\u9fff]+(?=\s+[A-Z]*[\u4300-\u9fff]+)', r'\g<0>,', source)
^^^ ^
</code></pre>
<p>或者使用一个原子组模拟,在一个正的前瞻中结合消费模式中的反向引用进行捕获,并进行前瞻性检查,看是否已经有逗号:</p>
^{pr2}$
<p>请参阅<a href="https://regex101.com/r/kF0vR3/1" rel="nofollow">regex demo</a>(和<a href="https://regex101.com/r/kF0vR3/2" rel="nofollow">demo 2</a>)-不要注意<code>\x{}</code>符号,因为我使用的是PHP选项,所以它只用于演示)。在</p>
<p>参见<a href="https://ideone.com/GA4xdM" rel="nofollow">IDEONE Python 3 demo</a>:</p>
<pre><code>import re
p = re.compile(r'[A-Z]*(?=([\u4300-\u9fff]+))\1(?!,)', re.IGNORECASE | re.U)
test_str = "山牆 山墙,shan1 qiang2,gable\nB型超聲 B型超声, B xing2 chao1 sheng1,type-B ultrasound"
result = p.sub(r"\g<0>,", test_str)
print(result)
# => 山牆, 山墙,shan1 qiang2,gable
# => B型超聲, B型超声, B xing2 chao1 sheng1,type-B ultrasound
</code></pre>