Python中匹配"汉字+数字"模式的正则表达式

3
在Python 3.3中,我想匹配下面的模式,但一直匹配失败。
摄氏零下253

我使用了以下正则表达式。
[^\x00-\x47\x58-\x7F]+

它难道不是排除了除数字外的所有ASCII字符吗?


2
用什么编程语言? - Giacomo1968
@JakeGould 我正在使用Python。 - MJ Park
好的。我提供了一个使用PHP作为示例的答案,但同时也提供了两个正则表达式示例,您可以轻松使用或调整。 - Giacomo1968
@JakeGould 我确实得到了一些启示。谢谢 :) - MJ Park
4个回答

9

根据您使用的编程语言不同,您可以使用以下方法。

[\p{Han}\p{N}]+

\p{Han} 匹配汉字字符。
\p{N} 匹配任何脚本中的任何数字字符。

实时演示


\p{N}在Java中无法使用,你有什么等价的想法吗? - Hasen

3
你把ASCII码的十进制和十六进制值混淆了。转义序列\x表示十六进制转义,你应该使用所需ASCII字符的十六进制值。根据ASCII表(http://www.asciitable.com/),范围应为02F,然后是3A7F,你的正则表达式应该像这样:
[^\x00-\x2F\x3A-\x7F]+

然而,上述正则表达式包含了除了127个ASCII字符和数字以外的所有字符(实际上,它包括除中文字符以外的所有字符)。

评估正确,但是当你进入多字节字符世界时,在不同的语言之间跳转时,正则表达式并不是那么清晰明了。 - Giacomo1968
没错,但我想指出来给楼主看,以防将来出现错误。 - spinningarrow

1

不确定您使用的是哪种语言,但是当使用预定义的Unicode脚本时,此正则表达式适用于PHP:

/(?:[\p{Han}0-9]+)/simu

这个也一样,可能更具可移植性,因为不是所有的正则表达式实现都有预定义的Unicode脚本集:
/[\x{4e00}-\x{9fa5}0-9]+/simu

这里有一些测试代码,两个正则表达式都已经就位; 注释其中一个以进行测试:

// Set the test string.
$string = '摄氏零下253';

// Run it through preg_match.
// $regex = "/(?:[\p{Han}0-9]+)/simu";
$regex = "/[\x{4e00}-\x{9fa5}0-9]+/simu";
preg_match($regex, $string, $matches);

// Send a UTF-8 header out so it looks nice.
header('Content-Type: text/html; charset=UTF-8');

// Dump the matches.
echo '<pre>';
print_r($matches);
echo '</pre>';

以下是该脚本的结果:

Array
(
    [0] => 摄氏零下253
)

0

正则表达式有一些扩展,例如命名字符组。

您可以使用以下组:

\p{Han} 代表汉字字符。

正则表达式如下:

[\p{Han}]+[0-9]+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接