Python运维基础(4)正则表达式

正则表达式

正则表达式简介

正则表达式描述了一种字符串匹配的模式(pattern),是处理字符串的强大工具(效率上不如字符串自带的方法),拥有自己独特的语法以及独立的处理引擎:可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则表达式匹配的大致过程如下:
依次将表达式中的字符与文本内容进行比对,如果每一个字符都能匹配上,则匹配成功,否则匹配失败。

简单实例

  • ^[0-9]+abc$
  • ^为匹配字符串的开始位置
  • [0-9]+匹配多个数字,[0-9]匹配单个数字
  • abc匹配字母abc并以abc结尾,$为匹配输入字符串的结束位置

为什么使用正则表达式?
普通的搜索和替换方法可以满足对静态文本的简单操作,但它缺乏灵活性,如果采用这种方法搜索动态文本,就会变得非常困难。

正则表达式的语法

正则表达式是有普通字符(a到z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
例如:
- runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
- runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
- colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。

普通字符:包括所有大小写字母,数字,标点以及一些其他符号。

非打印字符:换页符(\f),换行符(\n),回车符(\r)等等

特殊字符:有一些特殊含义的字符,若要匹配这些字符,必须先对这些字符进行转义

这里写图片描述

限定符:
例如前面实例中的 * + ?等等。

*、+限定符都是贪婪的,因为它们会尽可能多的匹配文字。
在它们的后面加上?可以实现非贪婪或最小匹配

定位符:
定位符用来描述字符串或单词的边界,^ 和 $ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。

python正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符是否与某种模式匹配。
re模块使得python语言拥有全部的正则表达式功能。

compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法可用于正则表达式的匹配和替换。多用于编译正则表达式模式。

re.S : 匹配包括换行在内的所有字符
re.I : 使匹配对大小写不敏感
re.L : 做本地化识别匹配,法语等
re.M : 多行匹配,影响^和$
re.X : 该标志通过给予更灵活的格式以便将正则表达式写得更易于理解
re.U : 根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B

re模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。


import re

(1)re.match函数:尝试从字符串的起始位置匹配一个模式,如果不是在起始位置匹配成功,match()就返回None
(2)re.search方法:扫描整个字符串并返回第一个成功的匹配。匹配成功返回一个匹配对象,否则返回None,同样,也可以使用group()或者groups()匹配对象函数来获取匹配表达式。

re.search(pattern, string, flags)中,pattern表示匹配的正则表达式,string表示要匹配的字符串。

上述两者的区别:

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


eg : re.match()

import re
print(re.match('www', 'www.runoob.com').span())  
print(re.match('com', 'www.runoob.com'))

Output :
(0, 3) # 在字符串的开始就匹配成功
None # 在一开始没能匹配成功


eg : re.search()

f = re.search('com', 'www.baidu.com').span()
print(f)
print(re.search('hahaha', 'www.baidu.com'))

Output :
(10, 13) # 扫描整个字符串并且成功匹配
None # 未找到匹配项

补充知识:

span():
用单个元组把开始和结束时的索引一起返回。如果re在字符串起始位置匹配,那么 start() 将总是为零,但是如果不是在起始位置匹配,则start()就不会是零了。


eg : group()

>>> m.group()
 'tempo'
>>> m.start(), m.end()
 (0, 5)
>>> m.span()
 (0, 5)

>>> print p.match('::: message')
 None
>>> m = p.search('::: message') ; print m
 <re.MatchObject instance at 80c9650>
>>> m.group()
 'message'
>>> m.span()
 (4, 11)

1. 匹配简单字符:

  1. 将正则表达式编译成Pattern对象
  2. 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
1:
p = re.compile(r'hello')
m = p.match('hello, world')
print(m)
print(m.group())

法2:
pattern = re.match(r'zhu', 'zhukeyan')  # 前面的内容在后面是否可匹配到,注意默认只能匹配开头的字符。
print(pattern.group())

re.match()前面参数表示匹配的正则表达式,后面的参数表示要匹配的字符串。
我们可以用group()或groups()匹配对象函数来获取匹配表达式。

2. split()方法按照能够匹配的字符将字符串分割后返回列表

p = re.compile(r'\d+')  # \d+表示匹配数字
r = p.split('one1two2three3four4')
print(r)

Output:[‘one’, ‘two’, ‘three’, ‘four’, ”]

将数字匹配出来,然后用匹配出来的数字对字符串进行分割。

3. findall():该方法能够以列表的形式返回能匹配的字符串。

p = re.compile(r'\d+')
m = p.findall('one1two2three3four4')
print(m)

Output : [‘1’, ‘2’, ‘3’, ‘4’]

4. re.sub()函数进行以正则表达式为基础的替换。

f = re.sub('[abc]', 'o', 'Marc')
print(f)
# 'Marc'中匹配到a,c,然后用'o'来替换掉匹配到的内容。

Output : Moro

f = re.sub('[abc]', 'o', 'account', 1)
print(f)
# 后面的参数决定了只能替换一个

Output : occount

5. 正则表达式(图片来自www.cnblogs.com/huxi)
这里写图片描述

猜你喜欢

转载自blog.csdn.net/in_nocence/article/details/78790593