正则表达式题
? 会用到的语法
注意: 1. 转义字符
group()用法参考 2. 重复前边的字串多次
示例
回到顶部
一. 判断字符串是否是全部小写代码
? 究其因 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 分析 缩写词 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[i] + "[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‘) 结果 问题 上面代码对于例子中的前3个是正确的,但是后面的两个就错了,因为大写字母开头的词语之间还夹杂着小写字母词 规律? 大写字母 + 小写(大于等于1个)+ 空格 + [小写+空格](0次或1次) 技巧 中间的?小写字母集合+一个空格,看成一个整体,就加个括号。要么同时有,要么同时没有,这样需要用到?,匹配前方的整体。
回到顶部
三. 去掉数字中的逗号具体示例 在处理自然语言时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): #搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。? mm = com.group() print "hi:",mm print "sen_before:",sen sen = sen.replace(mm,mm.replace(",","")) print "sen_back:",sen,‘n‘ 使用函数finditer(string[,pos[,endpos]]) | re.finditer(pattern,string[,flags]): 搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。 ? ? ? 参考代码3-2 sen = "abc,mnp" while 1: mm = re.search("d,d",sen) if mm: mm = mm.group() sen = sen.replace(mm,"")) print sen else: break 延伸 这样的程序针对具体问题,即数字3位一组,如果数字混杂与字母间,干掉数字间的逗号,即把“abc,4,mnp”转化为“abc,1234789,mnp” 思路 更具体的是找正则式“数字,数字”找到后用去掉逗号的替换 参考代码3-3 sen = "abc,"")) print sen else: break print sen
回到顶部
四. 中文处理之年份转换(例如:一九四九年--->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) 运行结果 可以看出第二个、第三个都出现了错误。 改进——准化成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) 识别出来可以通过替换方式,把汉字替换成数字。 参考
有一个文件,文件名为output_1981.10.21.txt 。下面使用Python: 读取文件名中的日期时间信息,并找出这一天是周几。将文件改名为output_YYYY-MM-DD-W.txt (YYYY:四位的年,MM:两位的月份,DD:两位的日,W:一位的周几,并假设周一为一周第一天) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |