正则表达式定义:
用事先定义好的一些特殊字符、及这些特点字符的组合,组成一个“规则字符串”,
这个“规则字符串”用来表达对字符串的一种过滤逻辑。
常用的正则表达式的方法:
re.compile(编译)
pattern.match(从头找一个)
pattern.search(找一个)
pattern.findall(找所有)
pattern.sub(替换)
. 不能匹配 \n 当findall方法匹配不到结果时会返回一个空列表
当在DOTALL模式中也能匹配换行符。
添加一个参数即可
缩写,效果相同
反斜杠
与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。使用原生字符串写出来的表达式更直观。
\ 为转义字符,可以使后一个字符改变原来的意思如果希望 . 就代表其原本的含义,只需要在前面加上一个 \
第一个findall方法的点代表的是匹配所有字符,所以当然可以匹配到点
第二个findall方法的 .\ 代表查找 点 所以匹配到点
[...]类似或的意思
a[bcd]e 可以匹配 abe ace ade 但是不可以匹配 abcde
可以使用 + 或者 | 实现匹配
数量词的贪婪模式与非贪婪模式
正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。
列表中有三个元素 此时和是否贪婪无关 是因为换行符的原因
点号匹配不到换行符 所以结束
贪婪效果:
列表只有一个元素,此时会尽可能的匹配 >
非贪婪效果(尽可能少的匹配):
此时匹配到第一个 > 发现满足条件,返回一个结果,接着进行匹配所以有三个元素。
pattern.sub(替换) \d 为数字 digit
re.compile()
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
使用正则表达式进行匹配的流程
在python执行到这一行时
re.sub("\d","_",b),python将能够匹配的结果全部读到内存,挨个和b进行匹配
我们可以将其提前编译将能够匹配的结果预先放到内存中去,拿到编译之后的结果进行sub方法
这样我们就不用反复的去获取内存这样的操作 减少了耗时提高了效率
此时pattern中已经包含了正则表达式,所以已不需要提供正则表达式。
使用compile时re.S需要在编译时添加,在findall中添加无效果
原始字符串 r
将 r 放在一个字符串前面表示一个原始的字符串
例如 \n 表示换行符 我们想表示原始的一个\ 和一个 n
可以 转义为 \\n r"\n" 等效于 "\\n"
\n是一个字符
使用 r \ 为 \\
使用原始字符串的好处:在正则表示式中使用 r ,我们可以忽略一个转义符号带来的转义的影响
使用 \\ 转义过于麻烦只在前面加 r 即可
补充:
re.findall(r"a.*bc","a\nbc",re.S)和re.findall(r"a(.*)bc","a\nbc",re.S)的区别
不分组时匹配的是全部,分组时匹配的是组内的内容 即括号里面的内容
当我们需要ab中间的东西时可以加括号~ 括号前后的内容用于定位和过滤的效果
match() 匹配 一个字符
set = re.match(r"\d","55") set.group() ===> 返回5 匹配 0-9 单个字符
set = re.match(r"\d\d","5") 返回空对象 不满足规则 解决方案
set = re.match(r"\d{1,2}","5") set.group() ===> 返回 ‘5’
set = re.match(r"\d{1,2}","15") set.group() ===> 返回 ‘15’
set = re.match(r"\d{3}","15") 返回空对象
set = re.match(r"\d{3}","1554846") set.group() ===> 返回 ‘155’
re.match(r"[1-36-8]","5") 返回空对象
set = re.match(r"[1-8a-d]","a") set.group() ===> 返回 ‘a’
set = re.match(r"[1-8a-dA-Z]","B") set.group() ===> 返回 ‘B’
re.match(r"[1-8abcd]","e") 返回空对象
set = re.match(r"\w","_") set.group() ===> 返回 ‘_’ \w ----> [0-9a-bA-Z] + 下划线_
python3 中 \w 支持中文匹配
* 0 1 多 ? 有 没有 + 至少1 (1 多 )
这个不对 正则 aga# --》age age#3# ---age \w还可能是中文
不可以 a#123 age! 取出来的 分别是 a age
正则匹配完,字符串也必须同时匹配完 $ 匹配字符串结束尾 ^ 匹配字符串开头 python中 match 默认字符串开头判断
匹配4-20的163邮箱账号
aaaaa@163Acom . 需要转义
re. search 并不是从头开始匹配,匹配到数据就会返回
re. findall 返回一个列表 不需要 group
re.sub 正则替换
参数可以直接调用函数
re.split 正则切割 返回列表