擅长:python、mysql、java
<p>我建议在数字之间匹配并捕获这些字符(以便稍后在输出中恢复它们),并且只在其他上下文中匹配它们。在</p>
<p>在python2中,它看起来像</p>
<pre><code>import re
s = u"中国,中,。》%国foo中¥国bar@中123=国%中国12-34中国"
pat_block = u'[^\u4e00-\u9fff0-9a-zA-Z]+';
pattern = u'([0-9]+{0}[0-9]+)|{0}'.format(pat_block)
res = re.sub(pattern, lambda x: x.group(1) if x.group(1) else u"" ,s)
print(res.encode("utf8")) # => 中国中国foo中国bar中123国中国12-34中国
</code></pre>
<p>参见<a href="http://ideone.com/8v1ufA" rel="nofollow noreferrer">Python demo</a></p>
<p>如果需要在任何Unicode数字中保留这些符号,则需要将<code>[0-9]</code>替换为<code>\d</code>,并将<code>re.UNICODE</code>标志传递给regex。在</p>
<p>正则表达式看起来像</p>
^{pr2}$
<p>它的工作原理如下:</p>
<ul>
<li><code>([0-9]+[^\u4e00-\u9fff0-9a-zA-Z]+[0-9]+)</code>-第1组捕获
<ul>
<li><code>[0-9]+</code>-1+位数</li>
<li><code>[^\u4e00-\u9fff0-9a-zA-Z]+</code>-1+个字符,而不是在指定范围内定义的字符</li>
<li><code>[0-9]+</code>-1+位数</li>
</ul></li>
<li><code>|</code>-或</li>
<li><code>[^\u4e00-\u9fff0-9a-zA-Z]+</code>-1+个字符,而不是在指定范围内定义的字符</li>
</ul>
<p>在python2.x中,当一个组在<code>re.sub</code>中不匹配时,对它的反向引用是<em>None</em>,这就是为什么需要lambda表达式来检查组1是否首先匹配。在</p>