python之正则表达式【re】

  在处理字符串时,经常会有查找符合某些规则的字符串的需求。正则表达式就是用于藐视这些规则的工具。换句话说,正则表达式是记录文本规则的代码。

1、行定位符。

  行定位符就是用来表示字符串的边界,“^”表示开始,“$”表示行的结尾。例

^sjc
sjc$

  ^jsc表示匹配以 sjc开始的字符串,sjc$匹配以htm结尾的字符串,如果想2个都匹配的话直接 输入jsc即可。

2、元字符

  正则表达式还右很多元字符,例如下面的正则表达式中应用了"\b"和“\w”。

\bmr\w*\b

  上面的正则表达式用于匹配字母mr开头的单词,先从某个单词的开始出(\b),然后匹配字母mr,接着是匹配任意数字的字母或者数字(\w*),最后单词结尾处(\b).表达式可以匹配 mrsoft,mr124,等,但是不能匹配cbmr。常用的元字符表如下所示。

代码 说明 举例
. 匹配除了换行符以外的任意字符

.可以匹配\mr\nM\tR中的m、r、M、\t、R

\w 匹配字母、数字、下划线或者汉字 \w可以匹配"m中7r\n"中的“m、中、7、r”,但是不能匹配\n
\W 匹配除了字母、数字、下划线或者汉字以外的字符 \W可以匹配“\n,但是不能匹配“m,中,7,r”
\s 匹配单个的空白字符(包含tab键和换行符) 可以匹配mr\tMR中的\t
\S 除了空白符以外的所有字符

可以匹配mr\tMR中的m、r、M、R

\b 匹配单词的开始或者结束,单词的分界符通常是空格,表单符号或者换行 在“i like mr or am”字符串中,\bm与mr中的m相匹配,不和am匹配
\d 匹配数字 \d可以与m7ri中的字符7匹配

3、限定符

  在上面的例子中,使用(\w*)匹配任意数量的字母或者数字,如果想匹配特定数量的数字,该如何表示?正则表达式提供了限定符(指定数量的字符)来实现该功能。如果匹配9位的QQ号可以用以下表达式:

^\d{9}$

常用的限定符如下

限定符 说明 举例
匹配前面的字符0次或者1次 colou?r,该表达式可以匹配colour和color
+ 匹配前面的字符一次或多次 go+gle,该表达式可以匹配的范围从gogle到goo***gle
* 匹配前面的字符0次或者多次 go*gle该表达式可以匹配的范围从ggle到goo***gle
{n} 匹配前面的字符n次 go{2}gle,该表达式只能匹配到google
{n,} 匹配前面的字符最少n次 go{2,}gle,该表达式可以匹配的范围从google到goo***gle
{n,m} 匹配前面的字符最少n次,最多m 次 employe{0,2}该表达式可以匹配employ,employe和employee3种情况

4、字符类

  正则表达式查找数字和字母很简单,因为已经有了对应这些字符集合的元字符,但是如果只要匹配没有预定义元字符的字符集合比如(a,c,i,o,u)呢?

  只需要在方括号里面列出他们即可,像[aciou]可以匹配到这些字母,[.?!]匹配标点符号(“,”“?”或者“!”),也可以轻松地指定一个字符范围,向“【0-9】”代表的含义与“\d”就是完全一致的;

备注:想要匹配给定字符串中任意一个汉字可以使用“[\u4e00-\u9fa5]”,如果要匹配连续多个汉字,可以使用“[\u4e00-\u9fa5]+”

5、排除字符

  匹配不符合指定字符集的字符串正则表达式提出了“^”字符。在【1】的时候我们用这个符号表示,在行的开始,但是如果把它放到[ ]中的话,表示非,排除的意思,比如

[^a-zA-Z]#该表达式用于匹配一个不是字母的字符。

6、选择字符

  试想一下,如果匹配身份证号码?身份证号长度是15位或者18位,15位时,全为数字,如果为18位时,前17位位数字,最后一位是校验位,可以为数字或者字符X。

  上面的描述中,包含着条件的逻辑,这就需要用选择字符(|)来实现该字符可以理解为“或”,匹配身份证号码的正则表达式可以写到一下方式:

(^\d{15}$)|(^\d{18}$)|(^\d{17}x$)(\d|X|x)$
#以数字开头的15位数字
#以数字开头的18位数字
#以数字开头的17位数字,后一位可以为数字,X或x

7、转义字符

  正则表达式中的转义字符(\)和python中大同小异,都是将特殊字符【. ? \ 等】变成一个普通的字符。\? 代表转义了?

备注:如果要讲匹配字母m开头的单词的正则表达式转换为模式字符串,则不能直接在两侧添加引号定界符。如

‘\bm\w*\b’#不正确
“\\bm\\w*\\b”#必须把\进行转义
如果包含大量的特殊字符和反斜杠。可以用R或r.
r'\bm\w*\b'

8、分组

  小括号()字符第一个作用就是可以改变限定符的作用范围   例如1。第二个作用就是分组,也就是子表达式,如(\.[0-9]{1,3}){3})就是对分组(\.[0-9]{1,3})进行重复操作

(six|four)th
#如果不用小括号的话,就会匹配six ,和 fourth

二、利用re模块实现正则表达式操作 

  python提供了re模块,用于实现正则表达式的操作,在实现时,可以利用re模块提供的方法如(search(),match(),findall()等)进行字符串处理,也可以先使用re模块的compile()方法将模式字符串转换为正则表达式对象,然后再使用正则表达式对象的相关方法来操作字符串。

  re模块的使用时,需要先应用import语句 引入。

improt re

1、使用match()方法进行匹配

  match()方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回match对象,否则返回None。具体羽凡格式如下: 

re.match(pattern,string,[flages])

参数说明:

pattern:表示模式字符串,由要匹配的正则表达式转换而来

string:表示要匹配的字符串

flags:可选参数,表示标志位,用于控制匹配房型,常用的标志如图所示

标志 说明
A 对于\w、\W、\b、\B、\d、\D、\s、\S只进行ASCII匹配
I 只想不区分字母大小写的匹配
M 将^和$用于包括整个字符串的开始和结尾的每一行
S 使用(.)字符匹配所有字符,包括换行符
X 忽略模式字符串中未转义和注释

例如,匹配字符串是否以“mr_”开头,不区分大小写,代码如下

import re
pattern = r'mr_\w+'# 模式字符串
string = 'MR_SHOP mr_shop' #要匹配的字符串
match = re.match(pattern,string,re.I)#匹配字符串,不区分大小写
print(match)
#输出<re.Match object; span=(0, 7), match='MR_SHOP'>
string = '项目名称MR_SHOP mr_shop'
match = re.match(pattern,string,re.I)
print(match)
#输出None

从上面可以看出,match()方法从字符串的开始位置开始匹配,当第一个字母不符合条件时,则不进行匹配,直接返回None

  match对象中包含了匹配值的位置可以使用的end()方法:通过span()方法可以返回匹配位置的远足;通过string属性可以获取要匹配的字符串。例如

import re
pattern = r'mr_\w+'#
string = 'MR_SHOP mr_shop'
match = re.match(pattern,string,re.I)
print(match.start())#匹配值的起始位置 0
print(match.end())#匹配值得结束位置7
print(match.span())#匹配位置的元组(0,7)
print(match.string)#匹配的字符串(MR_SHOP mr_shop)
print(match.group())#匹配的数据(MR_SHOP)

 ①实例1 验证输入的手机号码是否为中国移动号码?

import re
while True:
    mobile= input("请输入手机号码,退出请输入q")
    pattern = r'(13[4-9]\d{8})$|(15[01289]\d{8})$'
    #匹配模式
    match = re.match(pattern,mobile)#进行匹配
    if match == None:
        print(mobile,'不是有效的移动手机号')
    else:
        print(mobile,'是有效的手机号码')

2、进行search()进行匹配

  search()方法用于整个字符串中搜索第一个匹配的值如果在起始位置匹配成功,则返回match对象,否则返回None,search()方法的语法格式如下:

import re
pattern = r'mr_\w+' #模式字符串
string = 'MR_SHOP mr_shop'
match = re.search(pattern,string,re.I)#
#搜索字符串,不区分大小写
print(match)
string = "项目名称MR_Shop mr_shop"
match = re.search(pattern,string,re.I)
print(match)
#输出<re.Match object; span=(0, 7), match='MR_SHOP'>
#<re.Match object; span=(4, 11), match='MR_Shop'>

3、使用findall()方法进行匹配

  findall() 方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。  

import re
pattern = r'mr_\w+' #模式字符串
string = 'MR_SHOP mr_shop'
match = re.findall(pattern,string,re.I)#
#搜索字符串,不区分大小写
print(match)
string = "项目名称MR_SHOP mr_shop"
match = re.findall(pattern,string,re.I)
print(match)
#输出['MR_SHOP', 'mr_shop']
#['MR_SHOP', 'mr_shop']

如果在指定的模式字符串中,包含分组,则返回与分组匹配的文本列表。例

import re
pattern = r'[1-9]{1,3}(\.[0-9]{1,3}){3}'#模式字符串
string = '127.0.0.1 192.168.1.55'
match = re.findall(pattern,string)
print(match)#输出['.1', '.55']

  从上面的结果可以看出,并没有得到匹配的IP地址,这是因为在模式字符串中出现了分组,所以得到的结果是根据分株进行匹配的结果,既“(\.[0-9]{1,3})”匹配的结果,如果想获取整个模式字符串的匹配,可以将整个模式字符串使用一对小括号进行分组,然后再获取结果时,只取返回值列表的每个元素(是一个元组)的第一个元素,代码如下:

import re
pattern = r'([1-9]{1,3}(\.[0-9]{1,3}){3})'#模式字符串
#1-9的数字,随机出现1至3次,然后是,  .1到9的数字,出现1至3次,共匹配3次。
#这里只是做个例子,不是准确的IP地址匹配。
string = '127.0.0.1 192.168.1.55'
match = re.findall(pattern,string)#[('127.0.0.1', '.1'), ('192.168.1.55', '.55')]
for item in match:
    print(item[0])
#输出127.0.0.1
#192.168.1.55

4、替换字符串

  sub()方法用于实现字符串替换,语法格式如下

re.sub(pattern,repl,string,count,flags)

  参数说明:

  pattern:表示模式字符串,由要匹配的正则表达式转换而来。

  repl:表示替换的字符串

   string:表示要被查找替换的原始字符串

  count:可选参数,表示模式匹配后替换的最大次数,默认为0,表示替换所有的匹配

  flags:可选参数,表示标志位,用于控制匹配方式,如是否区分大小写,常用标志位I表示。

   例如,隐藏中奖信息的手机号码,代码如下:  

import  re
pattern = r'1[34578]\d(9)'#定义要替换的模式字符串
string = '中奖号码为:84978981,联系电话为:13688888888'
result = re.sub(pattern,"13666666666",string)#替换字符串
print(result)
#输出:中奖号码为:84978981,电话为:13666666666

 5、使用正则分隔字符串

  split()方法用于实现根据正则表达式分隔字符串,并以列表的形式返回。其作用同字符串对象的split()方法类似,所不同的就是分隔字符由模式字符串指定。语法如下

re.split(pattern,string,[maxsplit],[flags])

参数说明:

pattern:表示模式字符串,由要匹配的正则表达式转换而来

string:表示要匹配的字符串。

maxsplit:可选参数,表示最大的拆分次数

flags:不说了,自己看前面的解释 ,标志位

例如:被定为的URL地址中提取出请求地址和各个参数,代码如下:

import re
pattern = r'[?|&]'#定义分隔符,以?或&分隔
url = 'http://www.baidu.com/login.jsp?username="mr"&pwd="123456"'
result = re.split(pattern,url)
print(result)
#输出['http://www.baidu.com/login.jsp', 'username="mr"', 'pwd="123456"']

猜你喜欢

转载自www.cnblogs.com/sunjinchao/p/11976912.html
今日推荐