原文地址为: python正则表达式 小例几则

会用到的语法

正则字符

释义

举例

+

前面元素至少出现一次

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, "不全是小写!"

结果

究其因

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 rea = "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)   #123print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)   #abcprint 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 AgencyIRA    Irish Republican ArmyDUP    Democratic Unionist PartyFDA    Food and Drug AdministrationOLC    Office of Legal Counsel

分析

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

参考代码

import redef 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次)

参考代码

import redef expand_abbr(sen, abbr):    lenabbr = len(abbr)    ma = '' for i in range(0, lenabbr-1):        ma += abbr[i] + "[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:", mmprint "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,123,456,789,mnp"while 1:    mm = re.search("\d,\d", sen)if mm:        mm = mm.group()        sen = sen.replace(mm, mm.replace(",", ""))print senelse:break

结果

延伸

这样的程序针对具体问题,即数字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 senelse:breakprint sen

结果

四. 中文处理之年份转换(例如:一九四九年--->1949年)

中文处理涉及到编码问题。例如下边的程序识别年份(****年)时

# -*- coding: cp936 -*-import rem0 =  "在一九四九年新中国成立"m1 =  "比一九九零年低百分之五点二"m2 =  '人一九九六年击败俄军,取得实质独立'

def fuc(m):    a = re.findall("[零|一|二|三|四|五|六|七|八|九]+年", m)if a:for key in a:print keyelse:print "NULL"

fuc(m0)fuc(m1)fuc(m2)

运行结果

可以看出第二个、第三个都出现了错误。

改进——准化成unicode识别

# -*- coding: cp936 -*-import rem0 =  "在一九四九年新中国成立"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 keyelse:print "NULL"

fuc(m0)fuc(m1)fuc(m2)

结果

识别出来可以通过替换方式,把汉字替换成数字。

参考

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 keyif key in numHash:            newword += numHash[key]else:            newword += keyreturn newword

def Chi2Num(line):    a = re.findall(u"[\u96f6|\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d]+\u5e74", line)if a:print "------"print linefor words in a:            newwords = change2num(words)print wordsprint newwords            line = line.replace(words, newwords)return line

View Code

四. 推荐

Python正则表达式指南

转载请注明本文地址: python正则表达式 小例几则

python正则表达式 小例几则相关推荐

  1. python画图小例(玫瑰、佩奇、哆啦A梦、美队盾牌)

    玫瑰 from turtle import * import timesetup(600, 800, 0, 0) speed(0) penup() seth(90) fd(340) seth(0) p ...

  2. python正则表达式(2)

    Python正则表达式 by 寒小阳(hanxiaoyang.ml@gmail.com) 正则表达式是处理字符串的强大工具,拥有独特的语法和独立的处理引擎. 我们在大文本中匹配字符串时,有些情况用st ...

  3. 跟小廖一起学习Python正则表达式!

    Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. r ...

  4. 3每天Python小例-爬取淘宝网页商品

    代码是从https://github.com/gxcuizy/Python/tree/master/%E4%BB%8E%E9%9B%B6%E5%AD%A6Python-%E6%8E%98%E9%87% ...

  5. python正则表达式需要模块_使用Python正则表达式模块,让操作更加简单

    处理文本数据的一个主要任务就是创建许多以文本为基础的特性. 人们可能想要在文本中找出特定格式的内容,比如找出存在于文本中的电子邮件,或者大型文本中的电话号码. 虽然想要实现上述功能听起来很繁琐,但是如 ...

  6. 菜鸟教程python正则表达式_Python正则表达式常用函数菜鸟教程

    这篇文章主要为大家详细介绍了Python正则表达式常用函数菜鸟教程,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! Py ...

  7. Python正则表达式匹配中文

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 参照Py ...

  8. Python 正则表达式各种特殊符号 重点

    Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. r ...

  9. Python正则表达式初识(二)

    前几天给大家分享了[Python正则表达式初识(一)],介绍了正则表达式中的三个特殊字符"^"."."和"*",感兴趣的伙伴可以戳进去看看, ...

最新文章

  1. 使用Maven创建Java项目
  2. 如何查询中文期刊等级分类表_必备 | 如何查找期刊是否为核心刊物、SCI、SSCI、CSSCI、ISTP?...
  3. 空间数据挖掘技术理论及方法
  4. tia v15 添加项目_作为一名机器人集成项目的电气工程师,你及格吗?
  5. 6-5 顺序表操作集 (20 分)(创建,查找,插入,删除)以及顺序表的理解
  6. java font.getfont_java – 无法解析方法’getFont(?)’
  7. 关于Bugzilla WebService接口
  8. oracle 精度异常01438,序列值超过字段精度导致ORA-01438
  9. Maven学习总结(12)——eclipse中构建多模块maven项目
  10. Vensim学习之Random Normal函数的使用
  11. 关于下载Keil5无法打开keil4文件的问题解决方案
  12. 原创 | 从土地财政到数据财政
  13. android高仿ios控制中心,控制中心IOS 13-安卓仿苹果ios控制中心插件
  14. 语音信号调制matlab,第二章 语音信号的数字模型 数字语音处理及MATLAB仿真 教学课件.ppt...
  15. AI写小说!ChatGPT创作福尔摩斯小说,3分钟狂写856字,就问人类慌不慌?
  16. TOR交换机和普通交换机有什么区别?
  17. 知识图谱是什么,知识图谱有什么特点?
  18. Adaboost算法介绍
  19. 好用的需求文档管理工具Telelogic DOORS
  20. Python干掉了98%的办公软件

热门文章

  1. 阿里的Leader为什么牛逼?秘密都在“三板斧”里...
  2. linux审计日志发送,Linux审计日志
  3. 系统架构设计笔记(63)—— 实时嵌入式操作系统
  4. RT-Thread 1. GD32移植RT-Thread Nano
  5. 访问nginx默认页报403错误解决方法
  6. Android 9.0 WebView多进程问题
  7. 【如何简单优雅的来用Docker布置Python环境跑脚本【Linux / 宝塔】】
  8. 山东财经大学新生赛暨天梯赛选拔赛 F.简单排序(思维)
  9. 深度之眼-kesci-银行营销案例分析
  10. Android图像处理之像素点处理效果--(5)