正则表达式

python 使用正则表达式(re)来进行匹配引擎搜索

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

关于正则表达式,必须先学会它的元字符

元字符 : ^  $  *  +  ?  { }  [ ]  |  ( )  \

.  匹配除\n(换行符)以外的任何字符,若指定flag DOTALL,则匹配任意字符,包括换行

s = re.findall('b...u', 'www.baidu.com www')
>>> ['baidu']

 

^  匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)

s = re.findall('^w.w', 'www.baidu.com wWw')
>>> ['www']

 

$  匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以

s = re.findall('w.w$', 'www.baidu.com wWw')
>>> ['wWw']

 

*  匹配*号前的字符0次或多次

s = re.findall('abc*', 'abccccccc')
>>> ['abcccccc']
s = re.findall('abc*', 'ab')
>>> ['ab']

 

+   匹配前一个字符1次或多次

s = re.findall('abc+', 'abccccccc')
>>> ['abcccccc']

 

?   匹配前一个字符1次或0次

s = re.findall('abc?', 'abccccccc')
>>> ['abc']

 

{n}  匹配前一个字符n次,即前一个字符至少出现n次

s = re.findall('abc{2}', 'abccccccc')
>>> ['abcc']

 

{n,m}  匹配前一个字符n到m次

s = re.findall('abc{2,3}', 'abccccccc')
>>> ['abccc']

 

|  匹配|左或|右的字符

s = re.findall('abc|ABC', 'abcABC')
>>> ['abc', 'ABC']

 

()   提取括号中的内容

s = re.findall('(bai)', 'www.baidu.com')
>>> ['bai']

 

[ ] 字符集:1、[ab] 取a或b 2、字符集里的符号没有特殊的意义 3、尖角号^取反 4、选择出某种元素

# 1、[] 里面的元素取其一
s = re.findall('[aid]', 'www.baidu.com')
>>>['a', 'i','d']
# 2、消除符号的特殊意义
s = re.findall('[*]', 'abccccccc*')
>>>['*']
# 3、取反
s = re.findall('[^abc]', 'abcABC')
>>>['A', 'B', 'C']
# 4、选择元素(数字或字母)
s = re.findall('[a-z]', 'ab123c41d2ABeC')
>>>['a', 'b', 'c', 'd', 'e']

 

\   反斜杠后边跟元字符去除特殊功能,反斜杠后边跟普通字符实现特殊功能

 

通用字符

\A    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
\Z    匹配字符结尾,同$
\D    匹配非数字
\S    匹配任何非空白字符
\W    匹配非[A-Za-z0-9]
\d    匹配数字0-9,十进制数字
\w    匹配[A-Za-z0-9],匹配任一字母、数字、下划线
\s    匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'

 

模式修正符,一般放在最后位置

I  re.I   不区分大小写

M re.M 多行匹配,改变'^'和'$'的行为

S re.S  点任意匹配模式,改变'.'的行为

 

常用的匹配语法

re.findall()  # 完全匹配,把所有匹配到的字符放到以列表中的元素返回
re.findall('com','www.baidu.com map.baidu.com')
>>> ['com', 'com']

re.match()    # 从头开始匹配
re.match('com','www.baidu.com map.baidu.com')
>>> None

re.search()   # 搜索匹配,仅返回一个结果;通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
re.search('com','www.baidu.com map.baidu.com').group()
>>> com

re.split()    # 按照能够匹配的子串将字符串分割后返回列表。maxsplit用于指定最大分割次数,不指定使用默认值0将全部分割
re.split('\d','www.1baidu2.3com',2) # 默认为0,即全部分隔;指定次数后只分隔两次
>>> ['www.', 'baidu', '.3com']
re.split(' ','www.baidu.com map.baidu.com') # 分隔空格
>>> ['www.baidu.com', 'map.baidu.com']

re.sub()      # 匹配字符并进行替换
re.sub('\d','ai','www.b1du.com ',1) # 替换一次
>>> www.baidu.com
re.subn()     # 与 sub 函数完全一致,只不过其返回值是包括两个元素的元组:(new_string, number);第一个返回值 new_string 为sub 函数的结果,第二个 number 为匹配及替换的次数。
ret=re.subn('\d','ai','www.b1du.com map.b2du.com',2) # 替换两次
>>> ('www.baidu.com map.baidu.com', 2)

 

re 模块的两种匹配模式

贪婪模式:尽可能多的去匹配

惰性模式:尽可能少的去匹配(后面加?号来限制)

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄