模块之正则


re模块--在python里操作正则表达式的模块
  用途--验证字符串的合法性,爬虫

正则表达式--基本的东西
正则表达式是一种客观存在的一种规则
re模块是python提供的操作正则表达式的工具
正则表达式就是匹配字符串内容的一种规则(工具:regex)

字符集---[多种可能]--表示一个字符的位置--# 多种可能可以是范围--必须是从小到大

元字符--占一个字符所表示的内容
重点,常用
. 匹配除了换行符以外的任意字符
\w 匹配字母数字或下划线
\s 匹配任意的空白符
\d 匹配数字
a|b 匹配字符a或字符b
()匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...]在字符集里表示匹配除了字符组中的所有字符
比较常用
\n 匹配换行符
^ 匹配字符串的开始
$ 匹配字符串的结尾
不太常用
\t 制表符
\b 匹配单词的结尾
\W 匹配非字母数字或下划线
\D 匹配非数字
\S 匹配非空白符

量词--只表示前面一个字符的次数
* 重复零次或更多次
+ 重复一次或更多次
?重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

规则:#贪婪匹配(字符+量词):
每个量词只控制前面一个字符的出现次数
这个量词的匹配方式就是贪婪匹配(尽量多的匹配,能匹配多少匹配多少)
非贪婪匹配: 字符+量词+?
常用: .*? + 任意字符,匹配到任意字符就返回
分组:约束多个字符集匹配次数

转义符
在正则里想表示换行符\n,需要写\\n,想表示字符串"\n",要写 \\\\n
python的规则:r"放正则表达式"---取消python里的各种转义符

回溯算法---正则贪婪匹配的本质就是回溯算法


re模块
import re
ret = re.findall("正则表达式","要匹配的字符串")---直接返回一个列表,每个结果都是字符串,找不到返回空列表
print(ret)

ret2 =  re.search("正则表达式","要匹配的字符串")---匹配找到的第一个结果,找不到返回None
if ret2:
    print(ret2.group())

ret3 = re.match("正则表达式","要匹配的字符串")---只匹配从头开始匹配到的值,找不到返回None
if ret3:
    print(ret3.group())
findall search match

 

小结:
在调用的角度上看没有区别,接受两个参数按照位置传,正则表达式和要匹配的字符串
返回值的区别:
re.findall()---列表,匹配到的所有内容都会出现在列表中,如果没有匹配到返回空列表
re.search()--如果匹配到结果返回第一个匹配到的,如果没有匹配到返回None
--返回值用group()方法取出来
re.match()--只匹配从头开始匹配到的第一个值,如果没有匹配到返回None
--返回值用group()方法取出来

import re
re.split("[ab]","afdbndf")---先按a去分割,再按b去分割

import re
re.sub("新的","旧的","需要替换的内容","次数")---替换

import re
ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret)

import re
obj = re.compile('\d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())  #结果 : 123

import re
ret = re.finditer('\d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
print(ret)  # <callable_iterator object at 0x10195f940>
print(next(ret).group())  #查看第一个结果
print(next(ret).group())  #查看第二个结果
print([i.group() for i in ret])  #查看剩余的左右结果
一些常用功能

 

re.findall()优先级问题:
分组的优先匹配,优先显示,只显示分组里的内容
在分组里加 ?: 就可以全部显示了

re.split()优先级问题:
如果先分组再分割,分隔符也会保留并输出

标签语言
分组命名 #分组命名:(?P<name>\w+),分组赋值:(?P=name)
?P<变量名>---只取到标签名
import re
ret = re.search("<\w+>\w+</\w+>","<h1>hello</h1>")
print(ret.group())

import re
ret = re.search("<(?P<name>\w+)>\w+</(?P=name)>","<h1>hello</h1>")
print(ret.group())#---全部取出来
print(ret.group("name"))#---只取标签名
#分组命名:(?P<name>\w+),分组赋值:(?P=name)

import re
ret = re.search("<(?P<name>\w+)>(?P<a>\w+)</(?P=name)>","<h1>hello</h1>")
print(ret.group())#---全部取出来
print(ret.group("name"))#---只取标签名
print(ret.group("a"))#---取到内容
分组命名

 

分组的用途
对多个字符进行整体的量词约束
对于一条匹配的正则,只对其中我需要的内容进行分组

 

 















posted @ 2017-09-13 15:34  chitalu  阅读(102)  评论(0)    收藏  举报