天天看点

python正则表达小结

定义

正则表达式简单的理解就是一些字符和特殊符号组成的字符串,用以描述特定的字符,从而进行文本匹配、搜索等功能。

python中使用re模块来支持,r’’表示正则。u’’ 表示unicode。

 r‘abc’:正则。表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。

正则表达式内容主要包括:表示方法、函数、标识符。

表示方法

简单的分为四类: 符号,括号,\..(特殊符号)、扩展正则。

符号(^,$ . 重复?、+、* 、|):

| :管道或 

''."  :匹配\n外任意字符

^ :匹配开头。注:方括号内^代表非 [^a]——除了a字符

$ :匹配结尾

a*: 0或多次a字符

a+:1次或多次a字符

a?:匹配0次或1次a字符

括号(大中小):

{} :区间范围——匹配字符出现次数

       {m} 匹配m次出现的次数。例 1900-01-10 ,取年份 (\d){4}

       {m,n} 匹配m~n次前面出现的次数。

       {,n} 匹配0-n次字符

      re默认贪婪模式  baaaaa a{3,5} 结果是全匹配。非贪婪模式a{3,5}?——baaa。加“?“即可

[]:字符集——匹配字符集中的某一个字符

     小写字符匹配 : [a-z]

     数字匹配:  [0-9]

     非大写字符: [^A-Z]

     例:b[ae]t  匹配bat或者bet

():截取匹配的内容分组

     正则表达式中匹配到字符串后,将想取的字符串()起来,指定分组,便可随后用group获取。

特殊字符(\d,\w,\s,\b,\c ) ——其中小写和大写含义相反

\d (digital): 同 [0-9],匹配数字。 \D 即匹配非数字

\w(word): 同[0-9a-zA-Z_],匹配单个字符。 反\W

\s (space) : 匹配单个空格。反\S

\b(border) :匹配边界。简单的就是^,$ 是行中的开头结尾。\b用来设置字符串的开头和结尾

                    \bthe  匹配the开头, the\b 结尾。 \bthe\b  如a the b,仅匹配单词the。

                     反之 \B。  \Bthe  匹配任何包含the的字符串

扩展正则——条件正则:

形式:(?...) 

作用:条件检查

(?Limuxs)快捷使用标识符。可以使用多个,但大小写需要注意。

         例:re.findall(r'(?i)yes','yes.YES.Yes') 等同于re.findall(r'yes','yes.YES.Yes',re.I)。

(?=.com) 元素之后是 .com 才进行匹配操作。

(?!=.com) 元素之后不是 .com 才进行匹配操作。

(?<=…) 元素之前是才进行匹配操作。

(?:....)re.split(r'(?:,|;|\s)\s*', line), 不保存匹配到的分组

(?(1)y|x)   三元运算:组1存在匹配y,否则,匹配x

(?P<group_name>)分组

python正则表达小结

 (?P=group_name) 调用前面的分组。注意这里,后向引用是匹配前面的内容,而不是表达式。

问题:

1)re.findall(r'(?<=<\w+>).+?(?=</a>)','<a>this is a demo</a><p>demo two</p>')

出现  “look-behind requires fixed-width pattern”、

      python的re模块只支持定长的断言,前后都不能变长。

函数:

编译:re.compile(pattern,flags=0) 

用来编译一个正则表达式,返回一个正则表达式对象

r = re.compile('\bthe\b',re.I)

re.match(r, 'the book is mime')

编译提升效率、

查找:re.match()、re.serach()、re.findall()、re.finditer()

    match() 和search()  要匹配的内容,在正则里用()分组,然后用group()取出

re.match('pattern, string, flags=0) 

     pattern 为搜索内容的正则,string为缩写字符串,flag则为标识符

    尝试从字符串的起始位置匹配正则——匹配成功,返回一个匹配的对象。 

    如果匹配不成功的话,match()就返回None

re.search()

    参数同match。它是匹配搜索到第一对象——匹配成功,返回?

    如果匹配不成功的话,search() 也返回None

re.findall(pattern,string[, pos[, endpos]])

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

re.finditer(pattern, string, flags=0)

    类似findall ,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。迭代器对象.next() 为分组的对象地址,取值还要用group

finditer 迭代器返回值 group()使用需注意

re_a = re.findall(r'(th\w+)', st,re.I)

re_b = re.finditer(r'(th\w+)', st,re.I)

print(re_a)

print(re_b.next().groups())

print(re_b.next().groups())
           
['This', 'that']
           
('This',)
           
('that',)
           

替换:re.sub(pattern, repl, string, count=0, flags=0) 

    用repl替换string中的pattern

    pattern : 正则中的模式字符串,搜索的字符串。

    repl : 替换的字符串,也可为一个函数。

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

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

返回值:

    res = re.sub(....)        成功匹配,res返回替换后的字符串。未匹配,返回源字符串string

切片:re.split(pattern, string,max = 0 )

    max ——最多分隔max次

    s = re.split(r'f',a)

    用正则来对a分隔。返回的值为列表。

例: re.split(",","a,b,c")

        Out[4]: ['a', 'b', 'c']

分组:re.group()

    返回匹配到的分组,从1开始。

    re.group(0),返回正则表达式匹配的整个字符串 同re.group()

    re.groups(), 返回一个包含所有匹配子组的元组

标识符:

正则表达式——默认匹配的内容只有一行(换行符代表结尾)

1)$遇见换行符(\n)即终止。

2) re.S | re.I flag之间通过| 来进行合并

re.I 、re.IGNORECASE  : 忽略大小写

re.M、re.MULTILINE 读取多行内容时,同一行里以换行符为分隔匹配(改变$——多个\n多个$)

re.S、re.DOTALL   使.匹配所有字符包括换行\n——可以利用。*实现多行匹配

a = re.findall(r'(\w)l',a ,re.I)
c = re.findall(r'(\w)l',a ,re.I|re.S)
print(a)
print(c)
['2']
           

re.X、re.VERBOSE  该标志通过给予你灵活的格式

re.L 、re.LOCALE:本地识别匹配

re.U 根据Unicode字符解析字符。

备注:

        pycharm中可以安装plugins使用regexpTester,调试正则表达式的正确性。