python3-常用模块之re

正则表达式

定义:

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

 是一种独立的规则,独立的语言。只和字符串打交道。

能做什么?

例子1:把一个文件中所有的手机号码都找出来;

    # open打开文件

    # 读文件 str

    # 从一长串的字符串中找到所有的11位数字

# 一个字符一个字符的读

例子2:爬虫,从网页的字符串中获取你想要的数据

例子3:提取特定日志内容

规则

字符组:

[] 写在中括号中的内容,都出现在下面的某一个字符的位置上都是符合规则的

[0-9]  匹配数字                  

[a-z]  匹配小写字母             

[A-Z]  匹配大写字母             

[4-9]  匹配49数字                        

[a-zA-Z] 匹配大小写字母         

[a-zA-Z0-9] 匹配大小写字母+数字

[a-zA-Z0-9_] 匹配数字字母下滑线

 

转义符+元字符

\w  匹配数字字母下滑线 word关键字 [a-zA-Z0-9_]

\d  匹配所有的数字     digit     [0-9]

\s  匹配所有的空白符 回车/换行符 制表符 空格   space  [\n\t ]

\W \D \S \w \d \s取反

\b 表示单词的边界

[\s\S] [\d\D] [\w\W] 三组全集 意思是匹配所有字符

和转义字母相关的 元字符

\w \d \s(\n\t) \b \W \D \S

 

 

元字符

^ 匹配一个字符串的开始

$ 匹配一个字符串的结束

. 表示匹配除换行符之外的所有字符

[]  只要出现在中括号内的内容都可以被匹配

[^] 只要不出现在中括号中的内容都可以被匹配

a|b  或  符合a规则的或者b规则的都可以被匹配

  # 如果a规则是b规则的一部分,a规则比b规则要苛刻/,就把a规则写在前面

  # 将更复杂的\更长的规则写在最前面

() 分组  表示给几个字符加上量词约束的需求的时候,就给这些量词分在一个组

 

量词

{n}表示 这个量词之前的字符出现n

{n,} 表示这个量词之前的字符至少出现n

{n,m} 表示这个量词之前的字符出现n-m

? 表示匹配量词之前的字符出现 0次 或者 1次 表示可有可无

+ 表示匹配量词之前的字符出现 1次 或者 多次

* 表示匹配量词之前的字符出现 0次 或者 多次

 

练习:

 

匹配整数  \d+

匹配小数 \d+\.\d+

匹配小数或者整数  \d+\.\d+|\d+   \d+(\.\d+)?

 

 

 

匹配身份证号(暂不考虑校验规则):

[1-9]\d{14}(\d{2}[\dX])?

 

 

 

[1-9]\d{16}[\dX]|[1-9]\d{14}

 

 

 

 

贪婪匹配

在允许的范围内取最长的结果

非贪婪模式/惰性匹配 : 在量词的后面加上?

 .*?x   匹配任意非换行符字符任意长度 直到遇到x就停止

字符+量词    约束一个字符连续出现的次数

字符+量词+?  约束一个字符连续出现的最少次数

字符+量词+?+x 约束一个字符连续出现量词范围内的最少次数,遇到x就立即停止

 

以上都是正则表达式自身的规则,与python没有毛关系

Re模块

findall : 匹配所有 每一项都是列表中的一个元素

 

 

 

search : 只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的group方法来获取结果

 

如果没有匹配到,会返回None,使用group会报错

 

 

 程序中一般都是这样使用:

 

match:从头开始匹配,相当于search中的正则表达式加上一个^

 

 

字符串处理的扩展 : 替换 切割

split

 

 

 

 

 sub  旧的 新的 替换次数

 

 

 

 

 

 subn 返回一个元组,第二个元素是替换的次数

 

 

 

 

compile 模块 节省时间

直接把正则表达式编译成字节码,在多次使用的过程中,不会多次编译

 

 

 

 

 finditer 节省使用正则表达式解决问题的空间/内存

 

 

 

分组

group()表示总体匹配出的内容,group(num)表示匹配出第num个分组

import re
s = "<a>happy every day</a>"
res = re.search('(<\w+>)([\w\W]+)(</\w+>)',s)
print(res.group())  # 所有结果
print(res.group(1))  # 数字代表第几个分组
print(res.group(2))
print(res.group(3))

 

输出

 

Findall 优先级

ret = re.findall('www.(baidu|sina).com', 'www.sina.com')
print(ret)  # ['sina']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ret = re.findall('www.(?:baidu|sina).com', 'www.sina.com')
print(ret)  # ['www.sina.com']

 

flags有很多可选值:

re.I(IGNORECASE)忽略大小写,括号内是完整的写法
re.M(MULTILINE)多行模式,改变^和$的行为
re.S(DOTALL)点可以匹配任意字符,包括换行符
re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,不推荐使用
re.U(UNICODE) 使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python3中默认使用该flag
re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释

posted @ 2019-09-29 16:49  网瘾小伙  阅读(600)  评论(0编辑  收藏  举报