最近碰到一个需求,要求检测字段是否包含生僻字以及一些非法字符如 ~!@#$%^&*。

首先想到的就是利用 python 的正则表达式来匹配非法字符,然后找出非法记录。然而理想总是丰满的,现实却是残酷的。在实现的过程中,才发现自己对于字符编码、以及 python 内部字符串表示的相关知识的缺乏。在这期间,踩过了不少坑,到最后虽然还有些模糊的地方,但总算有一个总体清晰的了解。在此记录下心得,避免以后在同一个地方跌倒。

以下的测试环境是 ArcGIS 10.3 自带的 python 2.7.8 环境,不保证其他 python 环境也适用。

python 正则表达式

python 中的正则功能由内嵌的 re 函数库提供,主要用到 3 个函数。re.compile() 提供可重用的正则表达式,match() 和 search() 函数返回匹配结果,两者之间的区别在于: match() 从指定位置开始匹配,search() 会从指定位置向后搜索直到找到匹配字符串。例如下面的代码中,match_result 从第一个字符 f 开始匹配,匹配失败返回空值;search_result 从 f 开始向后搜索,直到找到第一个匹配的字符 a, 然后通过 group() 函数输出匹配结果为字符 a。

1

2

3

4

5

6

7

8

9

10import re

pattern = re.compile('[abc]')

match_result = pattern.match('fabc')

if match_result:

print match_result.group()

search_result = pattern.search('fabc')

if search_result:

print search_result.group()

以上的实现方式需要先编译一个 pattern,然后再进行匹配。实际上,我们可以直接利用 re.match(pattern, string) 函数来实现相同的功能。但是直接匹配的方式没有先编译再匹配的方式灵活,首先是正则表达式没办法重用,如果大量数据进行同一模式匹配,意味着每次都需要内部编译,造成性能损失;另外,re.match() 函数没有 pattern.match() 功能强大,后者可以指定从哪个位置开始匹配。

编码问题

了解 python 正则的基本功能后,剩下的事情就是找到一个合适的正则表达式来匹配生僻字和非法字符。非法字符很简单,采用以下 pattern 就可以实现匹配:

1pattern = re.compile(r'[~!@#$%^&* ]')

然而对于生僻字的匹配,着实难倒了我。首先是对于生僻字的定义,什么样的字算生僻字?经过咨询项目经理,规定非 GB2312 的字符属于生僻字。接下来的问题是,如何匹配 GB2312 字符?

经过查询,GB2312 的范围是 [\xA1-\xF7][\xA1-\xFE],其中汉字区的范围是 [\xB0-\xF7][\xA1-\xFE]。因此,添加生僻字匹配后的表达式为:

1pattern = re.compile(r'[~!@#$%^&* ]|[^\xA1-\xF7][^\xA1-\xFE]')

问题似乎是顺理得当地解决了,然而我还是 too simple too naive 。由于要判断的字符串都是从图层文件读取的,arcpy 贴心地将读取的字符编码为 unicode 格式。因此,我需要找出 GB2312 字符集在 unicode 中的编码范围。但现实是,GB2312 字符集在 unicode 中的分布并不是连续的,使用正则表示这个范围必定是非常复杂的。使用正则表达式匹配生僻字的构想,似乎陷入了死胡同。

解决方案

既然提供的字符串是 unicode 格式,那么我可不可以将其转换为 GB2312 再进行匹配呢?实际上是不行,因为 unicode 字符集要远大于 GB2312 字符集,因此 GB2312 => unicode 总是可以实现的,而反过来 unicode => GB2312 不一定能成功。

这突然为我提供了另外一种思路,假设一个字符串的 unicode => GB2312 转换会失败,那么是不是恰恰说明了它不属于 GB2312 字符集?所以,我使用 unicode_string.encode('GB2312') 函数尝试转换字符串,捕获 UnicodeEncodeError 异常来识别生僻字。

最终的代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14import re

def is_rare_name(string):

pattern = re.compile(u"[~!@#$%^&* ]")

match = pattern.search(string)

if match:

return True

try:

string.encode("gb2312")

except UnicodeEncodeError:

return True

return False

python正则检验_Python 检测生僻字相关推荐

  1. python生僻字如何转码_Python检测生僻字的实现方法

    import re pattern = re.compile('[abc]') match_result = pattern.match('fabc') if match_result: print ...

  2. python生僻字如何转码_如何用Python检测生僻字

    最近在工作中碰到一个需求,要求检测字段是否包含生僻字以及一些非法字符如 ~!@#$%^&*.通过网上的查找资料解决了,现在将解决的过程和示例代码分享给大家,有需要的可以参考借鉴.下面来一起看看 ...

  3. python且符号_Python检测符号及乱码字符

    最近在进行关键词的分析,发现在关键词词表中出现了很多乱码及特殊符号(有部分还是SQL注入),为了解决词问题,想着是否可以通过Python来检测符号和乱码字符.在在搜索引擎的帮助下,找到如下解决方案,测 ...

  4. python正则匹配_python 正则表达式详解

    正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能 ...

  5. python正则库_python 正则表达式第三方库 re的基本使用

    re模块简介: 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配,而re模块就是python中实现正则的模块 正则表达式简介: 非打印字符: 非打印字符也可以是正则表达 ...

  6. python 正则 空格_python 正则详解

    正则表达式概述 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),是计算机科学的 ...

  7. python图片马赛克_python 检测图片是否有马赛克

    原理讲的很清晰,给原博主一个赞 边缘检测之后按照正方形检索来判定是否是马赛克内容 原理知晓了之后就很好做了 话说MATLAB转化为python的过程还是很有趣的 from PIL import Ima ...

  8. python正则查找_python正则查找

    [转摘]PYTHON 正则表达式 网上转的一篇,把正则的规则系统的分类了.. 好文,共享,备查 ~~~~~~~~~~~ http://www.cnblogs.com/huxi/archive/2010 ...

  9. python探测端口_python检测远程服务器tcp端口的方法

    本文实例讲述了python检测远程服务器tcp端口的方法.分享给大家供大家参考.具体如下: python检测远程服务器tcp端口的代码,这段代码可以用来做服务器监控实用 #!/usr/bin/env ...

最新文章

  1. PHP和mysql的长连接
  2. 正则表达式匹配C++代码实现
  3. iframe显示错误页面
  4. 【转】我们今年二十三四岁。。。
  5. 数据结构-顺序表(C语言实现)
  6. arm体系结构与编程_教程:如何学习嵌入式系统(基于ARM平台)
  7. 电商设计提升水平,需要优秀的模板素材进行临摹练习!
  8. 吴恩达深度学习的实用层面编程作业:初始化Initialization
  9. 算法_栈的Java的通用数组实现
  10. 异步Udp监听关闭 出现异常,访问已释放的资源或者其他错误的解决方法
  11. Flex中Image加载图片出错显示默认图片
  12. win10透明任务栏教程
  13. 王刚日记:写文章和赚钱之间的关系
  14. 【kali-漏洞利用】(3.3)Metasploit后渗透(下):后渗透模块使用
  15. java+vue实现onlyoffice协同办公
  16. vue的基础知识-vue基础入门
  17. css——font 样式和对照表 颜色格式和颜色渐变
  18. 小红书MVP系统架构与技术选型(一)
  19. catia中画螺杆 螺纹
  20. ubuntu 临时修改ip

热门文章

  1. 百度翻译爬虫(案例练习:POST 请求)
  2. ubuntu编辑只读文件
  3. PCB抄板教程(PS更改底图方法)
  4. 网络运维系列:二级域名启用与配置
  5. ios14测试版兼容软件,iOS14测试版抢先体验教程!你的iPhone可以更新吗?【附iOS14独有彩蛋】...
  6. BZOJ1616[Usaco2008 Mar]Cow Travelling游荡的奶牛 dp
  7. meta property=“og:xxx“ seo 优化
  8. [Swift]LeetCode334. 递增的三元子序列 | Increasing Triplet Subsequence
  9. Dev-C++安装OpenCV
  10. (CVE-2014-0160)OpenSSL 心脏出血漏洞