python中的正则表达式

什么是正则表达式:

正则表达式是一种文本模式,正则表达式使用单个字符串来描述,匹配一系列匹配某个句法规则的字符串。

接下来介绍正则表达式的语法规则,首先介绍正则表达式中的特殊字符

  • $:匹配输入字符串的结尾位置。
  • ()标记一个子表达式的开始和结束位置,子表达式可以获取供以后使用。
  • *:匹配前面的子表达式零次或者多次
  • +:匹配前面的子表达式一次或者多次。
  • ?:匹配前面的子表达式零次或者一次
  • .*:任意匹配除换行符之外的任意单个或多个字符。
  • ^:匹配输入字符串的开始位置,除非在方括号表达式中使用。
  • |:指明两项之间的一个选择。
  • {n}:n是一个非负整数,匹配确定的n次。
  • {n,}:n是一个非负整数,至少匹配n次。
  • {n,m}:n,m是非负整数且n<=m,最少匹配n次,最多匹配m次。

现在介绍正则表达式中的定位符

  • ^:匹配输入字符串开始的位置。
  • $:匹配输入字符串结尾的位置。
  • \b:匹配一个单词边界。
  • \B:非单词边界匹配。

接下来介绍正则表达式中的元字符

  • [xyz]:字符集合,匹配所包含的任意一个字符。
  • [^xyz]:负值字符集合,匹配未包含的任意字符。
  • [a-z]:字符范围,匹配指定范围内的任意字符。
  • [^a-z]:负值字符范围,匹配任何不在指定范围内的任意字符。
  • \d:匹配一个数字字符,等价于[0-9]。
  • \D:匹配一个非数字字符,等价于[^0-9]。
  • \f:匹配一个换页符。
  • \n:匹配一个换行符。
  • \r:匹配一个回车符。
  • \s:匹配任意空白字符。
  • \t:匹配一个制表符。
  • \v:匹配一个垂直制表符。
  • \w:匹配字母、数字、下划线。
  • \W:匹配非字母
  • \xn:匹配n,其中n为十六进制转义值。
  • \num:匹配num,其中num是一个正整数。
  • 正则表达式后面全局标记g指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配。

正则表达式中的反向引用

反向引用需要使用到分组,分组就是使用()括起来的部分为一个整体,反向引用即为\1,\2:

  • \1:表示的是引用第一次()括起来的部分。
  • \2:表示的是引用第二次()括起来的部分。

在匹配分组的时候是由外往里匹配的,其次是由左往右匹配的。具体实例如下:

正则表达式中?=和?:和?!的理解:

  • ?::非获取匹配,匹配冒号后面的内容但不获取匹配结果(不将匹配结果存入缓存)。
  • ?=和?!:通过实例来了解
out = re.findall(r'\d+(?=abc)',"1abc") ## 只抽取数字,并且该数字后面跟的字符是"abc"
out1 = re.findall(r'\d+(?!abc)',"1abf") ## 只抽取数字,并且该数字后面跟的字符是"abc"
out3 = re.findall("A(?:\d{1,2}月)?D", "啊啊A22月DtttADgggg") ## 目的是抽取以A开头和D结尾的字符串
p

以上,对正则表达式有了基本的了解,接下来学习正则表达式如何在python中进行应用。

正则表达式在python中的应用:

讲到正则表达式,它的应用一定是用来匹配字符串,在python中的re模块拥有正则表达式的所有功能。

re.match函数:

第一个re的函数是re.match:match尝试从字符串的起始位置匹配,如果不是从起始位置匹配成功的话,match就会返回none。

re.match语法:re.match(pattern,string,flags=0)

  • pattern:匹配的正则表达式。
  • string:要匹配的字符串。
  • flags:标志符,用于控制正则表达式的匹配方式。

re.search函数:

re.search函数扫描整个字符串并返回第一个成功的匹配。

re.search语法:re.search(pattern,string,flags=0)。

在这里讲一下group,我们可以使用group(num)或group()匹配对象函数来获取匹配表达式。

import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
   print ("searchObj.group() : ", searchObj.group())
   print ("searchObj.group(1) : ", searchObj.group(1))
   print ("searchObj.group(2) : ", searchObj.group(2))
else:
   print ("Nothing found!!")

# 以上实例执行结果如下
# Cats are smarter than dogs
# Cats
# smarter

re模块提供的替换方法:

re模块提供了re.sub用于替换字符串中的匹配项。

re.sub语法:re.sub(pattern,repl,string,count=0,flags=0)

  • pattern:正则中的模式字符串。
  • repl:替换的字符串。
  • string:要被查找替换的原始字符串。
  • count:模式匹配后替换的最大次数。
  • falgs:编译时用的匹配模式。

其中值得注意的一点是,repl可以是一个函数,

compile函数:

compile函数用于编译正则表达式,生成一个正则表达式(pattern)对象,供match和search这两个函数使用。

re.compile语法:re.compile(pattern[,flags])

flags为匹配模式,常用的匹配模式有以下几种:

  • re.l:忽略大小写
  • re.L:表示特殊字符集
  • re.M:多行模式

findall函数:

在字符串中找到正则表达式所匹配的所有字串,并且返回一个列表,如果没有匹配的,则返回空列表。

findall语法:findall(string[,pos[,endpos]])

通过下列实例了解:

import re
pattern=re.compile(r'\d+')
result1=pattern,findall('runoob 123 google 456')
result2=pattern.findall('run88oob123google456',0,10)

# 以下为输出结果
# ['123','456']
# ['88','12']

re.finditer函数:

finditer和findall函数类似,在字符串中找到正则表达式所匹配的子串,并把它们作为一个迭代器返回。

re.finditer语法:re.finditer(pattern,string,flags=0)

实例:

import re
it = re,finditer(r'\d+','12a32bd43jf3')
for match in it:
    print(match.group)

# 以下为输出结果
# 12
# 32
# 43
# 3

re.split函数:

split方法按照能够匹配的子串将字符串分割后返回列表。

re.split语法:re.split(pattern,string[,maxsplit=0,flags=0])  其中maxsplit为分割次数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值