设为首页 收藏本站
查看: 1329|回复: 0

[经验分享] python正则表达式 小例几则

[复制链接]

尚未签到

发表于 2015-4-22 08:31:46 | 显示全部楼层 |阅读模式
  例子
  一. 判断字串是否全部为小写字母
  二. 找出句子中缩写词的全拼
  三. 把数字中的逗号(例如123,345,000)去掉
  四. 中文处理之年份转换(例如:一九四九年--->1949年)
  
  会用到的语法


正则字符



释义



举例



+


  前面元素至少出现一次

  ab+:ab、abbbb 等


*


  前面元素出现0次或多次

  ab*:a、ab、abb 等


?


  匹配前面的一次或0次

  Ab?: A、Ab 等


^


  作为开始标记

  ^a:abc、aaaaaa等


$


  作为结束标记

  c$:abc、cccc 等


\d


  数字

  3、4、9 等


\D


  非数字

  A、a、- 等


[a-z]


  A到z之间的任意字母

  a、p、m 等


[0-9]


  0到9之间的任意数字

  0、2、9 等

  注意:
  1. 转义字符



>>> s
'(abc)def'
>>> m = re.search("(\(.*\)).*", s)
>>> print m.group(1)
(abc)
  group()用法参考
  2. 重复前边的字串多次
  



>>> a = "kdlal123dk345"
>>> b = "kdlal123345"
>>> m = re.search("([0-9]+(dk){0,1})[0-9]+", a)
>>> m.group(1), m.group(2)
('123dk', 'dk')
>>> m = re.search("([0-9]+(dk){0,1})[0-9]+", b)
>>> m.group(1)
'12334'
>>> m.group(2)
>>>

  
  
  
  示例
  一. 判断字符串是否是全部小写
  代码



# -*- coding: cp936 -*-
import re  
s1 = 'adkkdk'
s2 = 'abc123efg'
an = re.search('^[a-z]+$', s1)
if an:
print 's1:', an.group(), '全为小写'
else:
print s1, "不全是小写!"
an = re.match('[a-z]+$', s2)
if an:
print 's2:', an.group(), '全为小写'
else:
print s2, "不全是小写!"
  结果
DSC0000.png
  究其因
  1. 正则表达式不是python的一部分,利用时需要引用re模块
  2. 匹配的形式为: re.search(正则表达式, 带匹配字串)或re.match(正则表达式, 带匹配字串)。两者区别在于后者默认以开始符(^)开始。因此,

re.search('^[a-z]+$', s1) 等价于 re.match('[a-z]+$', s2)
  3. 如果匹配失败,则an = re.search('^[a-z]+$', s1)返回None
  group用于把匹配结果分组
  例如



import re
a = "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)   #123abc456,返回整体
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)   #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)   #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)   #456
  1)正则表达式中的三组括号把匹配结果分成三组
  group() 同group(0)就是匹配正则表达式整体结果
  group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。
  2)没有匹配成功的,re.search()返回None
  3)当然郑则表达式中没有括号,group(1)肯定不对了。
  
  二.  首字母缩写词扩充
  具体示例

FEMA   Federal Emergency Management Agency
IRA    Irish Republican Army
DUP    Democratic Unionist Party

FDA    Food and Drug Administration
OLC    Office of Legal Counsel
  分析

缩写词  FEMA
分解为  F*** E*** M*** A***
规律    大写字母 + 小写(大于等于1个)+ 空格
  参考代码



import re
def expand_abbr(sen, abbr):
lenabbr = len(abbr)
ma = ''
for i in range(0, lenabbr):
ma += abbr + "[a-z]+" + ' '
print 'ma:', ma
ma = ma.strip(' ')
p = re.search(ma, sen)
if p:
return p.group()
else:
return ''
print expand_abbr("Welcome to Algriculture Bank China", 'ABC')
  结果
DSC0001.png
  问题
  上面代码对于例子中的前3个是正确的,但是后面的两个就错了,因为大写字母开头的词语之间还夹杂着小写字母词
  规律
  大写字母 + 小写(大于等于1个)+ 空格 + [小写+空格](0次或1次)
  参考代码



import re
def expand_abbr(sen, abbr):
lenabbr = len(abbr)
ma = ''
for i in range(0, lenabbr-1):
ma += abbr + "[a-z]+" + ' ' + '([a-z]+ )?'
ma += abbr[lenabbr-1] + "[a-z]+"
print 'ma:', ma
ma = ma.strip(' ')
p = re.search(ma, sen)
if p:
return p.group()
else:
return ''
print expand_abbr("Welcome to Algriculture Bank of China", 'ABC')
  技巧
  中间的 小写字母集合+一个空格,看成一个整体,就加个括号。要么同时有,要么同时没有,这样需要用到?,匹配前方的整体。
  
  三. 去掉数字中的逗号
  具体示例
  在处理自然语言时123,000,000如果以标点符号分割,就会出现问题,好好的一个数字就被逗号肢解了,因此可以先下手把数字处理干净(逗号去掉)。
  分析
  数字中经常是3个数字一组,之后跟一个逗号,因此规律为:***,***,***
  正则式
  [a-z]+,[a-z]?
  参考代码3-1



import re
sen = "abc,123,456,789,mnp"
p = re.compile("\d+,\d+?")
for com in p.finditer(sen):
mm = com.group()
print "hi:", mm
print "sen_before:", sen
sen = sen.replace(mm, mm.replace(",", ""))
print "sen_back:", sen, '\n'
  结果
DSC0002.png
  技巧
  使用函数finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):
  搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。      
  参考代码3-2



sen = "abc,123,456,789,mnp"
while 1:
mm = re.search("\d,\d", sen)
if mm:
mm = mm.group()
sen = sen.replace(mm, mm.replace(",", ""))
print sen
else:
break
  结果
DSC0003.png
  延伸
  这样的程序针对具体问题,即数字3位一组,如果数字混杂与字母间,干掉数字间的逗号,即把“abc,123,4,789,mnp”转化为“abc,1234789,mnp”
  思路
  更具体的是找正则式“数字,数字”找到后用去掉逗号的替换
  参考代码3-3



sen = "abc,123,4,789,mnp"
while 1:
mm = re.search("\d,\d", sen)
if mm:
mm = mm.group()
sen = sen.replace(mm, mm.replace(",", ""))
print sen
else:
break
print sen
  结果
DSC0004.png
  
  四. 中文处理之年份转换(例如:一九四九年--->1949年)
  中文处理涉及到编码问题。例如下边的程序识别年份(****年)时



# -*- coding: cp936 -*-
import re
m0 =  "在一九四九年新中国成立"
m1 =  "比一九九零年低百分之五点二"
m2 =  '人一九九六年击败俄军,取得实质独立'
def fuc(m):
a = re.findall("[零|一|二|三|四|五|六|七|八|九]+年", m)
if a:
for key in a:
print key
else:
print "NULL"
fuc(m0)
fuc(m1)
fuc(m2)
  运行结果
DSC0005.png
  可以看出第二个、第三个都出现了错误。
  改进——准化成unicode识别



# -*- coding: cp936 -*-
import re
m0 =  "在一九四九年新中国成立"
m1 =  "比一九九零年低百分之五点二"
m2 = '人一九九六年击败俄军,取得实质独立'
def fuc(m):
m = m.decode('cp936')
a = re.findall(u"[\u96f6|\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d]+\u5e74", m)
if a:
for key in a:
print key
else:
print "NULL"
fuc(m0)
fuc(m1)
fuc(m2)
  结果
DSC0006.png
  识别出来可以通过替换方式,把汉字替换成数字。
  参考


DSC0007.gif DSC0008.gif


numHash = {}
numHash['零'.decode('utf-8')] = '0'
numHash['一'.decode('utf-8')] = '1'
numHash['二'.decode('utf-8')] = '2'
numHash['三'.decode('utf-8')] = '3'
numHash['四'.decode('utf-8')] = '4'
numHash['五'.decode('utf-8')] = '5'
numHash['六'.decode('utf-8')] = '6'
numHash['七'.decode('utf-8')] = '7'
numHash['八'.decode('utf-8')] = '8'
numHash['九'.decode('utf-8')] = '9'
def change2num(words):
print "words:",words
newword = ''
for key in words:
print key
if key in numHash:
newword += numHash[key]
else:
newword += key
return newword
def Chi2Num(line):
a = re.findall(u"[\u96f6|\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d]+\u5e74", line)
if a:
print "------"
print line
for words in a:
newwords = change2num(words)
print words
print newwords
line = line.replace(words, newwords)
return line
View Code   
  四. 推荐

Python正则表达式指南
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59385-1-1.html 上篇帖子: arcgis for python (arcpy) 入门 下篇帖子: python开发_python中的list操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表