python正则表达式实例代码


Posted in Python onMarch 03, 2020

re 模块使 Python 语言拥有全部的正则表达式功能。

会用到的语法

正则字符 释义 举例
+ 前面元素至少出现一次 ab+:ab、abbbb 等
* 前面元素出现0次或多次 ab*:a、ab、abb 等
? 匹配前面的一次或0次 Ab?: A、Ab 等
^ 作为开始标记 ^a:abc、aaaaaa等
$ 作为结束标记 c$:abc、cccc 等
\d 数字 3、4、9 等 正则字符 释义 举例 + 前面元素至少出现一次 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 等
\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)

re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

实例1:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 
 
import re
print(re.match('www', '3water.com').span()) # 在起始位置匹配
print(re.match('net', '3water.com'))     # 不在起始位置匹配

输出结果:

(0, 3)
None

实例2:

#!/usr/bin/python
import re
 
line = "Cats are smarter than dogs"
 
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
 
if matchObj:
  print "matchObj.group() : ", matchObj.group()
  print "matchObj.group(1) : ", matchObj.group(1)
  print "matchObj.group(2) : ", matchObj.group(2)
else:
  print "No match!!"

输出结果:

matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter

上面是python2的print输出,python记得加()即可,python输出类似的别的语言的\n之类来匹配获取的内容。

python group()

正则表达式中,group()用来提出分组截获的字符串,()用来分组

重复前边的字串多次

>>> 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)
>>>

究其因

1. 正则表达式中的三组括号把匹配结果分成三组

group() 同group(0)就是匹配正则表达式整体结果
group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。
2. 没有匹配成功的,re.search()返回None

3. 当然正则表达式中没有括号,group(1)肯定不对了。

示例

1. 判断字符串是否是全部小写

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

结果

python正则表达式实例代码

究其因

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

输出结果

123abc456
123
abc
456

1)正则表达式中的三组括号把匹配结果分成三组

group() 同group(0)就是匹配正则表达式整体结果

group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。

2)没有匹配成功的,re.search()返回None

3)当然正则表达式中没有括号,group(1)肯定不对了。

2. 首字母缩写词扩充

具体示例

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[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')

结果

python正则表达式实例代码

问题

上面代码对于例子中的前3个是正确的,但是后面的两个就错了,因为大写字母开头的词语之间还夹杂着小写字母词

规律

大写字母 + 小写(大于等于1个)+ 空格 + [小写+空格](0次或1次)

参考代码

import re
def 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')

技巧

中间的 小写字母集合+一个空格,看成一个整体,就加个括号。要么同时有,要么同时没有,这样需要用到?,匹配前方的整体。

3. 去掉数字中的逗号

具体示例

在处理自然语言时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'

结果

python正则表达式实例代码

技巧

使用函数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

结果

python正则表达式实例代码

延伸

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

结果

python正则表达式实例代码

4. 中文处理之年份转换(例如:一九四九年--->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)

运行结果

python正则表达式实例代码

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

改进——准化成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)

结果

python正则表达式实例代码

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

参考

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

5. 多个手机号码,中间用|隔开

举例:

空值
12222222222
12222222222|12222222222
12222222222|12222222222|12222222444

表达式

s = "[\\d]{11}(\\|[\\d]{11})*|"

四. 推荐

到此这篇关于python正则表达式实例代码的文章就介绍到这了,更多相关python正则例子内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
linux系统使用python监测网络接口获取网络的输入输出
Jan 15 Python
在Python中使用matplotlib模块绘制数据图的示例
May 04 Python
Python2.x中文乱码问题解决方法
Jun 02 Python
Python操作MySQL数据库9个实用实例
Dec 11 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
Python程序中的观察者模式结构编写示例
May 27 Python
python中利用xml.dom模块解析xml的方法教程
May 24 Python
Python3实战之爬虫抓取网易云音乐的热门评论
Oct 09 Python
浅谈用Python实现一个大数据搜索引擎
Nov 28 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
用Python提取PDF表格的方法
Apr 11 Python
python 实现在无序数组中找到中位数方法
Mar 03 #Python
python的列表List求均值和中位数实例
Mar 03 #Python
基于Python数据分析之pandas统计分析
Mar 03 #Python
python 的numpy库中的mean()函数用法介绍
Mar 03 #Python
Python统计学一数据的概括性度量详解
Mar 03 #Python
python多维数组分位数的求取方式
Mar 03 #Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
Mar 03 #Python
You might like
PHP实现图片简单上传
2006/10/09 PHP
解读PHP的Yii框架中请求与响应的处理流程
2016/03/17 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
html数组字符串拼接的最快方法
2009/09/16 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
jQuery实现图片放大预览实现原理及代码
2013/09/12 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
jquery+正则实现统一的表单验证
2015/09/20 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
小程序点赞收藏功能的实现代码示例
2018/09/07 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
Python Logging 日志记录入门学习
2018/06/02 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
python画图的函数用法以及技巧
2019/06/28 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
Python 如何操作 SQLite 数据库
2020/08/17 Python
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
洗煤厂厂长岗位职责
2014/01/03 职场文书
个人贷款担保书
2014/04/01 职场文书
解决python绘图使用subplots出现标题重叠的问题
2021/04/30 Python