首页 > 技术文章 > python3之正则表达式

cn-7876 2017-07-11 16:39 原文

1. 正则表达式

1.正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
2.正则不属于任何语言,大多数语言都提供了正则的支持;正则是一种模式的描述,有其特定的描述符
3.学习正则分两步:
1.了解正则的描述符(修饰符):
正则表达式修饰符 - 可选标志
其中最主要的两个是
(1)re.I 使匹配对大小写不敏感;
(2)re.M 多行匹配,影响 ^ 和 $
模式符-正则表达式模式详细表
2.掌握特定语言的方法或函数: re模块

python3使用正则表达式:

  • re.match()函数
    函数语法:re.match(pattern, string, flags=0)
    其中:
  • pattern指匹配的正则表达式
  • string指要匹配的字符串
  • flags指标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
    匹配成功re.match方法返回一个匹配的对象,否则返回None。
import re
#re.match从开头匹配,匹配成功返回匹配对象,不成功返回None
re1 = re.match(r'www', 'www.baidu.com', re.I)
print(re1)  #<_sre.SRE_Match object; span=(0, 3), match='www'>匹配成功,返回的匹配对象
print(re1.span())   #span表示调用的区间(从?开始到?结束)
  1. re.search()函数
    函数语法:re.search(pattern, string, flags=0)里边的参数同上
    re.search 扫描整个字符串并返回第一个成功的匹配。
    例1:
import re
#re.search从整个字符串的任意位置开始
re2 = re.search(r'com', 'www.baidu.com', re.I)
print(re2)

例2:

re2 = re.findall(r'com', 'www.baidu.com,www.qq.com,www.360buy.cn,www.taobao.com', re.I)
for e in re2:
        print(e)   #输出的结果:  com com  com


re3 = re.finditer(r'com', 'www.baidu.com,www.qq.com,www.360buy.cn,www.taobao.com', re.I)
for i in re3:
    print(i)
#输出的结果:
#<_sre.SRE_Match object; span=(10, 13), match='com'>
#<_sre.SRE_Match object; span=(21, 24), match='com'>
#<_sre.SRE_Match object; span=(50, 53), match='com'>

通过上述两个方法的对比,可以看出:虽然两个函数都可以求出匹配的个数,但是还是有根本的区别:re.findall()函数返回的是本身的个数;re.finditer()函数返回的是匹配的对象的个数

re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

检索和替换
语法:re.sub(pattern, repl, string, count=0)
参数:

  • pattern : 正则中的模式字符串
  • repl : 替换的字符串,也可为一个函数
  • string : 要被查找替换的原始字符串
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配

    实例:

import re

phone = "2004-959-559 # 这是一个电话号码"

# 删除注释
num = re.sub(r'#.*$', "", phone)
print ("电话号码 : ", num)

# 移除非数字的内容
num = re.sub(r'\D', "", phone)
print ("电话号码 : ", num)

输出的结果:

电话号码 :  2004-959-559 
电话号码 :  2004959559

repl 参数是一个函数

以下实例中将字符串中的匹配的数字乘于 2:

import re
def shuang(m):
    v = int(m.group())   #group()默认的参数和sub()的参数一致
    return str(v*2)
print(re.sub(r'(\d+)', shuang, 'has 5 give 2 ,give he 1 ,sheng 1'))

输出的结果为:

has 10 give 4 ,give he 2 ,sheng 2

python利用正则表达式爬取数据:

实例:

#抓取数据:
from urllib import request
url = "http://www.kgc.cn/list/"
for i in range(1, 3):
    fname = '230-{0}-6-9-9-0.shtml'.format(i)
    respone = request.urlopen(url+fname)
    #print(respone.read().decode('utf-8'))
    print('开始保存:{0}'.format(fname))
    f = open(fname, 'w+', encoding="UTF-8")
    f.writelines(respone.read().decode('utf-8'))
    f.close()


#爬取有用的数据:
import re
for i in range(1, 3):
    fname = '230-{0}-6-9-9-0.shtml'.format(i)
    f = open(fname, 'r', encoding='UTF-8')
    f2 = open('data-{0}.txt'.format(i), 'w+', encoding='UTF-8')
    print(f)
    htmlStr = f.read()
    p = r'<a href=".+" class="yui3-u course-title-a" target="_blank" alt=".+">(.+)</a>'
    p2 = r'<span class="course-pepo">(\d+)</span>'
    p3 = r'<span class="view0-old">(.+)</span>'
    rs1 = re.findall(p, htmlStr, re.I | re.M)
    rs2 = re.findall(p2, htmlStr, re.I | re.M)
    rs3 = re.findall(p3, htmlStr, re.I | re.M)

    for n in range(len(rs1)):
        f2.write("{0} {1} {2}".format(rs1[n], rs2[n], rs3[n]))
        f2.write('\n')
    f2.close()
    f.close()

简单的理解,有什么问题,希望大家提出宝贵的意见和建议……

推荐阅读