python之正则表达式

     正则表达式(regular expression)一般应用于数据的筛选、查找。是比较常用的工具。正则表达式按照其用途可以分为几大类:匹配单个字符、匹配多个字符,匹配字符位置、匹配分组等。

一、正则表达式字符

1.匹配单个字符:

                                            

                [^]          对中括号内的字符取反进行匹配

2. 匹配多个字符:

        

  3.匹配位置字符:

   

4. 匹配分组:

     

5.其他:

   

   

二、注意点:        

1. 关于 | 的使用 只能匹配到一个表达式,不能同时匹配两边表达式
例如:
a6="h(banana|pear)d" 
s=re.match(a6,“hbananapeard”
print(s.group()) #报错
2. 关于 ?P<name>组号:命名时不能使用(?P<name>)报错。例如
a1="<((?P<H>)[a-zA-Z1-6]+)><(?P<H1>[a-zA-Z1-6]+)>" 
b="<html><h2>fjslkfjwl , fjei</h2></html>" 
s=re.match(a1,b) 
print(s.group("H")) #结果空 
print(s.group(1)) #结果是html

 分析原因:加括号后,相当于又建立了一个分组,name分组内需要匹配的内容是空。

3、关于()分组及组号命名

   在正则中,括号具有特殊的应用。[]表示匹配(捕获)单个字符,{}表示多次匹配,()表示对里面的内容进行分组。其命名为从左到右,组号0表示整个表达式本身,因此第一个括号的组号为1。当然也可以使用?P<name>对组号进行命名。

import re
str='235 dfs  654 5648fdssd'
pattern=re.compile(r'(\d+) (\d+)')
a=re.search(pattern,str)
print(a.group(2))#结果是5648

  4.另一大难点是零宽断言

零宽断言:一个正则表达式中,零宽断言部分匹配字符串成功后,正则的其他表达式,仍旧从零宽断言开始匹配的位置进行,零宽匹配不占用长度。

先行后行:先行是从断言标志的开头查找,后行是从断言标志的结尾处进行查找。
正向零宽断言:(?=regx)
负向零宽断言:(?!=regx)
实例:
import re
a="singER dancinger ldsjfldj"
b="(?=ing)[\S]*"#先行断言,先查找到ing的位置,然后从i的位置开始查找
b1="(?<=ing)[\S]*"#后行断言, 先查找到ing的位置,然后从g的位置开始查找
c=re.findall(b,a)
print(c)
c=re.findall(b1,a)
print(c)


#思路要提取出标签的名字,因此需要用到零寬断言,另需要屏蔽< 和>,
#先使用后向断言可以从<后开始匹配,结尾使用使用先行断言可以匹配到>结束,
a1="<html><h1>fdf</h1></html>"
a2="<html>"
b="(?<=<)[^/].*?(?=>)"
c=re.findall(b,a1)
print(c)

5.正则表达式中常用函数:
search():查找字符串中的内容,找到即返回
find_all():查找字符串中所有的内容,以列表形式展示
match():从头开始匹配,不符合即匹配失败,与其他三个的查询方式完全不同:一个是查找,一个是匹配
sub():查找并替换字符串中的内容
三、一些常用的正则表达式

非负整数:
0|([1-9][0-9]*)

非零整数:-?[1-9]\d*

整数:(-?[1-9]\d*)|0

浮点数:-?(([1-9]\d*)|0)(\.\d*)?

5-10位英文数字或下划线:\w{5,10}

qq邮箱:[0-9a-zA-Z_]{4-20}@qq\.com

qq、sina、126邮箱:[0-9a-zA-Z_]{4-20}@(qq|163|126|sina)\.com

11位手机号码:^1\d{10}$

提取一堆html标签中内容:<([a-zA-Z1-6]+)>.*?</\\1>
  微博内容:^#[^#]+#

身份证:^[1-9]\d{16}[0-9x]

日期:^[12]\d{3}-([1-9]|1[0-2])-([1-9]|[12][0-9]|3[01])$
posted @ 2019-02-24 10:04  fjc0000  阅读(147)  评论(0编辑  收藏  举报