python正则匹配

一、各符号含义

. :匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式
* :匹配0个或多个
+:匹配1个或多个
?:区分贪婪匹配或费贪婪匹配,?代表尽可能匹配少的内容。
.+:一个或多个字符
.*:0个或多个字符
.+?:表示0或1个字符,非贪婪匹配,即尽可能匹配少的字符,最少1个
.*?:表示非贪婪匹配,即尽可能匹配少的字符,最少0个
.+或者.*:表示 贪婪匹配,就即匹配尽可能多的字符
\d:匹配一个数字
\d+:匹配至少一个数字
\w:匹配一个字母
\w+:匹配至少一个字母
\s:匹配一个空格
\s+:匹配至少一个空格
{n,m}:匹配n到m个字符
|:或者的意思,A|B表示A或者B
^:表示行的开头
$:表示行的结束
[]:表示范围

举例:
\d{2,7}:匹配2到7个数字
^\d:表示行以数字开头
\d$:表示必须以数字结束
[0-9a-zA-Z_]:表示匹配一个数字或字母或下划线

二、() [] {} 的含义

1、() 是为了提取匹配字符串的,表达式中有几个()就有几个相应的匹配字符串
2、[] 是定义匹配的字符范围。比如[a-zA-Z0-9]表示相应位置的字符要匹配英文字符和数字。[\s*]表示匹配空格或者*号。[, ]表示匹配逗号或者一个空格。
3、{}一般是用来匹配的长度。比如\s{3}表示匹配三个空格,\s[1,3]表示匹配1到3个空格。
例如:
(0-9)匹配’0-9’本身。[0-9]匹配数字(注意后面有,可以为空)[0-9]+匹配数字(注意后面有+,不可以为空)。
[0-9]{0,9}表示长度为0到9的数字字符串。

三、常用正则匹配函数

re.compile(regstr)
re.findall(regstr,messtr)

该函数根据包含的正则表达式的字符串创建模式对象,用法如下:

some_text = 'a,b,,,,c d'
reObj = re.compile('[, ]+')
str=reObj.findall(some_text) #等同于str=re.findall(reObj,some_text)和str=re.findall('[, ]+',some_text)
str1=reObj.split(some_text) #等同于re.split(reObj,some_text,)和re.split('[, ]+',some_text)

结果如下:
str=[’,’, ‘,’, ’ ']
str1=[‘a’, ‘b’, ‘c’, ‘d’]

四、特殊情况

我们最常用得正则匹配符号为.+或者.*或者.+?或者.*?,这些能满足匹配任意字符,但是却不能匹配换行符。
1、满足匹配换行符
在findall()的参数中添加re.S后,即可匹配换行符:

page='a href="www.bai\ndu.com"'
url_list=re.findall(‘href=\"(.*?)\"’,page, re.S)
//url_list=re.findall(r'href="(.*?)"',page, re.S)

结果为[‘www.bai\ndu.com’]
2、需要匹配得内容含有单引号、双引号、\、()等,这些都需要用反斜杠转义,如提取匹配字符串需要用到(),但是匹配的内容也含有()

str_1 = "sudo(19178)───sh(19179)───sh(19182)───sh(19185)"
re_key = re.compile("sudo\((\d+)\)───sh\((\d+)\)───sh\((\d+)\)───sh\((\d+)\)─")
ret = re_key.findall(str_1)

3、正则匹配串前加了r,代表该段代码没有转义字符,都是原字符,就是为了使得里面的特殊符号不用写反斜杠了。

str_1 = "sudo(19178)───sh(19179)───sh(19182)───sh(19185)"
re_key = re.compile(r"sudo((\d+))───sh((\d+))───sh((\d+))───sh((\d+)\)")
ret = re_key.findall(str_1)

4、如果匹配的原字符串是好几行呢?
如果你要多行匹配,那么需要加上re.S和re.M标志,re.S的作用是匹配换行符;加上re.M,作用是^$标志将会匹配每一行,默认^$只会匹配第一行。
例如:

str = "a23b\na34b"
re.findall(r"^a(.+)b", str)
#输出['23'],没有用re.S无法匹配换行符/n,所以输出不是['23b\na34']
re.findall(r"^a(\d+)b", str, re.M)
#输出['23', '34'],用re.M,代表匹配每行开头以a开头的内容