python 让繁琐工作自动化 第7章-模式匹配与正则表达式

1.import re :导入正则表达式模块

2.>re.compile() :传入一个字符串值(正则表达式),返回一个Regex对象.

3.Regex.search() :查找传入的字符串,寻找该正则表达式的所有匹配。没有找到该正则表达式模式,返回None;找到,返回一个Match对象。

4.Match.group():返回实际匹配到的文本

re.compile(r'\d{3}-\d{3}-\d{4}'):在字符串的第一个引号之前加上r,可以将该字符串标记为原始字符串,它不包括转义字符。

 

7.3 用正则表达式匹配更多模式

  • 括号分组
  1. phoneNumRegex = re.compile(r'(\d{3})-(\d{3}-\d{4})')

第一对括号是第一组,第二对括号是第二组

  1. match.group(1): 向group()匹配对象方法传入1或2,就可以获得匹配文本的不同部分。传入0或不传入参数,将返回整个匹配文本。
  2. Match.groups(),一次获取所有的分组-

areaCode,mainNumber = match.groups()

  1. 如果文本中有() ,需要用\(\) 进行转译

 

7.3.2 管道匹配多个分组

| :管道 ;

  1. 作用: 希望匹配许多表达式中一个。

heroRegex = re.compile(r'Batman|Tina Fey')

》第一次出现的匹配文本,将作为match对象返回。

》要返回全部的匹配文本,使用findall() 方法取代search()方法》

》若正则表达式没有分组,findall()返回字符串列表

》若正则表达式有分组,findall()返回元组列表

 

7.3.3 用?实现可选匹配

可选匹配:可以匹配或不用匹配

? 符号实现该功能

>eg:

phoneRegex = re.compile(r'(\d\d\d-)?\d\d\d-\d\d\d\d')

phoneRegex_m1 = phoneRegex.search('My phone number s 413-222-2332')

print(phoneRegex_m1.group())

phoneRegex_m2 = phoneRegex.search('My phone number is 555-2123')

print(phoneRegex_m2.group())

7.3.4 用*符号匹配0次或多次

即;*符号之前的分组,可以在文本中出现任意次。他可以完全不存在,或一次又一次地重复

br = re.compile(r'Bat(wo)*man')

m1 = br.search('The Adventures of Batman.')

print(m1.group())

 

m2 = br.search('The Adventures of Batwoman.')

print(m2.group())

 

m3 = br.search('The Adventures of Batwowowowoman.')

print(m3.group())

 

7.3.5 用+ 符号 匹配一次或多次

+与*不同的是,+符号前面的分组必须“至少出现一次”。

Eg:

br = re.compile(r'Bat(wo)+man')

m1 = br.search('The Adventures of Batman.')

if m1:

    print(m1.group())

 

m2 = br.search('The Adventures of Batwoman.')

if m2:

    print(m2.group())

 

m3 = br.search('The Adventures of Batwowowowoman.')

if m3:

print(m3.group())

 

7.3.6 用或括号匹配特定次数

1. 在正则表达式中该分组的后面,跟上花括号包围的数字。

(ha){3} :将匹配字符串‘HaHaHa’,但是不会匹配‘HaHa’.

  1. 还可以指定一个范围:即在花括号中写下一个最小值,一个逗号,和一个最大值。(Ha){3,5} 即匹配‘HaHaHa,HaHaHaHa,HaHaHaHaHa’

3.(Ha){3,} 将匹配3次或更多次的实例

(Ha){,5}将匹配0到5次实例

 

7.4 贪心和非贪心匹配

Eg:’HaHaHaHaHaHa’,(Ha){3,5}可以匹配3,4,个。而match对象的group()方法会返回HaHaHaHaHa,而不是更短的可能结果。

》Python的正则表达式默认是贪心的,表示在有二义的情况下,他们可能会匹配最长的字符串。

非贪心版本 在结束的花括号后跟着一个?

(Ha){3,5}?

>eg:

greedy = re.compile(r'(Ha|ha){3,5}')

m = greedy.search('HahahaHaha')

print(m.group())

 

nongreedy = re.compile(r'(Ha|ha){3,5}?')

m2 = nongreedy.search('HahahaHaha')

print(m2.group())

7.6 字符分类

\d 表示 0-9的任何数字 即(0|1|2|3|4|5|6|7|8|9)

\D 除0到9的数字以外的任何字符

\w 任何字母,数字或下划线字符(可以认为是匹配“单词”字符)

\W 除字母,数字和下划线以外的任何字符

\s 空格,制表符或换行符(可以认为是匹配“空白”字符)

\S 除空格,制表符,和换行符以外的任何字符

Eg:

rg = re.compile(r'\d+\s\w+')

m = rg.findall('12 drummers, 11 pipers 10 lords,9 ladies')

print(m)

 

7.7 建立自己的字符分类

Syntax : [] 定义自己的字符分类

Eg:>[aeiouAEIOU]将匹配所有元音字符,不论大小写

  1. 通过在字符分类的左方括号后加上一个插入字符(^),就可以得到“非字符类”。

》非字符类将匹配不在这个字符类中的所有字符。

7.8 插入字符和美元字符

插入符号 ^ :在正则表达式的开始处使用插入符号 ^, 表明匹配必须发生在被查找文本的开始处。

美元符号:$:表明该字符串必须以这个正则表达式的模式结束。

若同时使用^,$,表明整个字符串必须匹配该模式。

Eg:

beginWithHello = re.compile(r'^Hello')

m1 = beginWithHello.search('oh my god Hello World.')

m2 = beginWithHello.search('Hello, world.')

if m1:

    print('m1 :'+ m1.group())

if m2:

print('m2 :' + m2.group())

只运行 m2: hello.

 

>r’^\d+$’:匹配以数字0到9结束的字符串

7.9 通配字符

. (句点) :匹配除了换行之外的所有字符。

》句点字符只匹配一个字符。

7.9.1 点-星匹配所有字符

(.*) 表示任意文本-包括括号

.* 使用贪心模式;.*? 非贪心模式

1》 re.compile(‘.*’,re.DOTALL) 通过给re.compile()传入第二个参数re.DOTALL,可以将.*字符匹配所有字符。

 

7.10 正则表达式符号复习

》? 匹配0次或一次前面的分组

》*匹配0次或多次前面的分组

》+匹配一次或多次前面的分组

》{n}匹配n次前面的分组

》{n,}匹配n次或更多前面的分组

》{,m}屁屁0次到m次前面的分组

》{n,m}匹配至少n次,至多m次前面的分组

》{n,m}?进行非贪心匹配,匹配n次

》^spam :意味着 字符串必须以spam开始

》spam$ 意味着字符串必须以spam结束

\d, \w,\s 分别匹配数字,单词,空格

》\D,\W,\S 分别匹配除数字,单词,空格以外 的所有字符

》[a,b,c]匹配方括号内的任意字符

》[^abc]:匹配不在方括号内的任意字符

 

7.11 不区分大小写的匹配

向re.compile()传入re.IGNORECASE 或re.I作为第二个参数,让正则表达式不区分大小写。

7.12 用sub()方法替换字符串

>sub()返回替换完成后的字符串

7.13 管理复杂的正则表达式

忽略正则表达式字符串中的空白符和注释,向re.compile()传入变量re.VERBOSE,作为第二个参数。

》re.compile(’’’ ’’’)三重引号,创建一个多行字符串。

可以将正则表达式定义放在多行中,让它可以读。

phoneRegex = re.compile(r'''

    (\d{3}|\(\d{3}\))?  #Area code

    (\s|-|.)?           #separator

    (\d{3})             #3 digits

    (\s|-|.)            #separator

    (\d{4})             #last 4 digits

    ((\s*|ext|x|ext\.|)\s*(\d{2,5}))?   #extension

''',re.VERBOSE)

通过使用re.VERBOSE参数,黄色区域,红色字 被忽略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值