在Python中匹配“汉字+数字”模式的正则表达式
在Python 3.3中,我想匹配下面的模式,但总是失败。
摄氏零下253
我用了下面的正则表达式。
[^\x00-\x47\x58-\x7F]+
这个正则表达式难道不是排除了所有的ASCII字符,只留下数字吗?
4 个回答
0
正则表达式有一些扩展功能,比如可以使用命名字符组。
你可以使用以下的组:
\p{Han} 表示中文汉字。
那么正则表达式就是:
[\p{Han}]+[0-9]+
1
不太确定你会用什么语言来做这个,不过这个正则表达式在PHP中可以用,当你使用预定义的Unicode脚本时:
/(?:[\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
)
9
3
你把十进制和十六进制的ASCII数字搞混了。\x
这个转义序列表示的是十六进制转义,你需要用到的就是你想要的ASCII字符的十六进制值。
根据ASCII表(可以查看这个链接:http://www.asciitable.com/),范围应该是0
到2F
,然后是3A
到7F
,你的正则表达式应该像这样:
[^\x00-\x2F\x3A-\x7F]+
不过,上面的正则表达式包含了除了中文以外的其他字符(实际上,它包含了除了127个ASCII字符和数字以外的所有东西)。