Python 正则表达式的剖析

Python 正则表达式

正则表达式是用来帮助你方便查找字符串是否匹配于某种模式的一种特殊字符序列
Python 从1.5版本开始就增加了re.py(regular expression)模块,提供了Perl风格的正则表达式模式。
在Python中re模块提供了全部的正则表达式功能
re模块提供了各种功能函数,并且用pattern模式字符串作为第一个参数

正则表达式基础简单介绍

并不是说只有Python才有正则表达式,正则表达式在很多语言中都有十分重要的作用
下图展示了使用正则表达式匹配的流程:
这里写图片描述

正则表达式的大致匹配过程就是:依次拿出表达式和文本中的字符进行比较,如果每个字符都能匹配,则成功;一旦有匹配不成功的字符,则失败。如果表达式有量词或者边界,这个过程中会稍微有一点不同,看下图示例,多练习就OK啦。。。

这里写图片描述

数量词的贪婪模式与非贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪模式的,总是尝试匹配尽可能多的字符;非贪婪模式则相反,总是尝试匹配尽可能少的字符。例如:正则表达式“ab”如果用于查找”abbbc“,将找到”abbb”。而如果用非贪婪模式的数量词”ab*?”,将找到”a”。

反斜杠的困扰

正则表达式里使用’\’作为转义字符,就会造成反斜杠的困扰。如果要匹配字符’\’,在编程语言表示的正则表达式里将需要4个反斜杠’\\’:前两个用于编程语言里转义成反斜杠,后两个用于在正则表达式里转义成反斜杠。Python 的原生字符串就解决了这个问题。该例子中的正则表达式可以使用r”\”表示,同理匹配一个数字的’\d’可以写成r’\d’。

匹配模式

正则表达式提供了一些可用的匹配模式,例如忽略大小写,多行匹配等


re.match()

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

函数语法:

re.match(pattern,string,flags=0)

函数参数说明:

  • pattern 该参数是一个字符串,即用来匹配的正则表达式

  • string 该参数表示要匹配的字符串

  • flags 标志位,用于控制匹配方式,如是否区分大小写,多行匹配等。


如果匹配成功re.match()会返回一个匹配的对象,否则返回None
如:

import re
string = 'Hello world...how are you today? Hello world...'
pattern = 'Hello'
reOBJ = re.match(pattern,string)
print(reOBJ)

匹配成功返回一个对象
匹配成功返回值为一个对象

match()提供了很多可读属性和方法
属性:

  1. string : 匹配时使用的文本
  2. re : 匹配时使用的pattern对象
  3. pos: 文本中正则表达式开始搜索的索引。值与Pattern.match(),Pattern.search()方法的同名参数相同
  4. endpos : 文本中正则表达式结束搜索的索引。
  5. lastindex:最后一个被捕获的分组在文本中的索引。
  6. lastgroup: 最后一个被捕获的分组的别名

方法:
匹配对象方法:

  • group(num =0) 匹配的整个表达式的字符串,group()可以一次输入多个组好,在这种情况下它将返回一个包含那些组所对应值的元组。

  • groups() 返回一个包含所有小组字符串的元组,从1到所含的小组号。

例:

import re
line = 'Cats are smarter than dogs'
reOBJ = re.match(r'(.*) are (.*?) .*',line,re.M|re.I)
if reOBJ:
    print("matchreOBJ.groups():",reOBJ.groups())
    print("matchreOBJ.group():",reOBJ.group())
    print("matchreOBJ.group(1):",reOBJ.group(1))
    print("matchreOBJ.group(2):",reOBJ.group(2))
else:
    print("NoMatch")

groups() and group()

Pattern

Pattern对象是一个编译好的正则表达式,通过Pattern提供的一些方法可以对文本进行匹配查找
Pattern不能直接实例化,必须使用e.compile()进行构造。
Pattern提供了几个可读属性用于获取表达式的相关信息:

  1. pattern :编译时用的表达式字符串
  2. flags:编译时用的匹配模式,以数字的形式给出
  3. groups:表达式中的分组的数量
  4. groupindex:以表达式中有别名的组的别名为键,以该组对应的编号为值的字典没有别名的组不包括在内


import re
p = re.compile(r'(\w+)(\w+)(?P<sign>.*)',re.DOTALL)
print("P.pattern:",p.pattern)
print("p.flags:",p.flags)
print('p.groups:',p.groups)
print('p.groupindex:',p.groupindex)
这里写图片描述

re.search()

re.search()扫描整个字符串并返回第一个成功的匹配
函数语法:

re.search(pattern,string,flags=0)

函数参数说明:

  1. pattern : 匹配的正则表达式 pattern对象
  2. string :要匹配的字符串、
  3. flags:标志位控制正则表达式的匹配方式

    匹配对象方法:
    group() and groups() 语法同上re.match()

    re.match() 和re.search()的区别

    re.match()之匹配字符串的开始,如果字符串不匹配则失败,返回None,常用语用户名 和密码的验证;而re.search()匹配的是整个字符串,知道找到第一个匹配的为止。
    实例:

import re
line = 'I love dogs more than cats'
matchObj = re.match(r'dogs',line,re.M|re.I)
if matchObj:
    print('match.group:',matchObj.group())
else:
    print("No match")

matchObj = re.search(r'dogs',line,re.M|re.I)
if matchObj:
    print('search.group:',matchObj.group())
else:
    print('No match')

这里写图片描述

re.findall()

re.findall()搜索目标string,以列表的形式返回全部能匹配的子串
函数语法:
findall(string[,pos[,endpos]]) | re.findall(pattern,string[,flags])
实例:

import re
line = "one 1 two 2 three 3 four 4444"
pattern = re.compile(r'\d+')
print(pattern.findall(line))

这里写图片描述

re.split()

re.split() 按照能够匹配的子串将string分割后返回列表list。maxsplit用于指定最大分割数,不指定将全部分割
语法:
split(string[,maxsplit]) | re.split(pattern,string[,maxsplit])
实例:

import re
line = "one 1 two 2 three 3 four 4444"
pattern = re.compile(r'\d+')
print(pattern.split(line))

这里写图片描述

re.finditer()

re.finditer()搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器
语法:
re.finditer(string[,pos[,endpos]]) | re.finditer(pattern,string[,flags])
实例:

import re
line = "one 1 two 2 three 3 four 4444"
pattern = re.compile(r'\d+')
for item in pattern.finditer(line):
    print(item.group())

这里写图片描述

检索与替换

python 的re模块提供了re.sub 用于替换字符串的匹配项。常见用处为消除一些文本中的特殊符号
语法:

re.sub(pattern,repl,string,max=0) 

返回的字符串是在字符串中用RE最左面不重复的匹配来替换。如果模式没有发现,字符将被原样返回。可选参数count是模式匹配后替换的最大次数;count必须是非付整数。缺省值为0 表示将替换所有的匹配。
实例:

import re
phone = '1181-81-178 $ this is a phone Number'
num = re.sub(r'\$.*$','',phone)
print('phone:',num)
num = re.sub(r'\D',"",phone)
print('Phone:',num)

这里写图片描述

正则表达式可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过OR(|)来指定。如re.I | re.M 被设置成I和M标志:

  1. re.I(ignorecase) 使得匹配对大小写不敏感
  2. re.L (LOCALE)做本地化识别(local-aware) 匹配
  3. re.M(MULTILINE)多行匹配,影响^ 和$
  4. re.S(DOTALL) 匹配包括换行在内的所有字符
  5. re.U (UNICODE)根据Unicode字符集解析字符。该标志影响\w,\W,\b,\B
  6. re.X (VERBOSE)该标志通过给予你更灵活的格式以便于将RE写的更易于理解
    以下两种写法等价:
a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值