正则表达式
re匹配中文:[u4e00-u9fa5]
- 是一个计算机科学的概念
- 用于使用单个字符串来描述,匹配符合某个规则的字符串
- 常常用来检索,替换某些模式的文本
正则的语法
- .(点号)表示任意一个字符,除了\n,比如查找所有的一个字符.
- []:匹配括号中列举的任意字符,比如[L,Y,0]
- \d:任意一个数字
- \D:除了数字都可以
- \s:表示空格、tab键
- \S:除了空白符号
- \w:单词字符、就是a-z,A-Z,0-9
- \W:除了字符
- *:前面的内容0次或多次
- +:至少一次
- ?:0次或1次
- {m,n}: 出现最少m次,最多n次
- ^: 匹配字符串的开始
- $: 匹配字符串的结尾
- \b: 匹配单词的边界
- (): 对正则表达式内容进行分组,从第一个大括号开始,编号逐渐增大
验证一个数字: ^\d$
必须有一个数字,最少一位: ^\d+$
只能出现数字,且位数为5-10位: ^\d{5,10}$
注册者年龄 16岁以上,99岁以下: ^[16-99]$
只能输入英文字符和数字: ^[A-Za-z0-9]$
验证qq号码: ^[0-9]{5,12}
- \A: 只匹配字符串开头
- \Z: 仅匹配字符串末尾
- |: 左右任意一个
- (?P<name>…): 分组,除了原来的编号再制定一个别名
- (?P=name): 引用分组
RE 使用步骤
- 使用compile将表示正则的字符串编译成一个pattern对象
- 通过pattern对象提供一系列方法付文本进行查找匹配,获得匹配结果,一个match对象
- 最后使用Match对象提供的属性和方法获得信息,根据需要进行操作
RE 常用函数
- group() 获得一个或者多个分组匹配的字符串,当获得整个匹配的子串时,直接使用group 或者 grop(0)
- start:获取分组匹配的子串在整个字符串的起始位置 参数默认为0
- end: 获取分组匹配的子串在整个字符串的结束位置 默认为0
- span 返回的结构技术 (start(group),end(group))
import re
p = re.compile(r'\d+')
## 3,10 表示查找的范围
m = p.match("qwq1233qewsfsfrrgrsc",3,10)
print(m)
## match 可以输入参数;查到的结果只包含一个 表示第一次匹配成功的内容
-------------------------------------------------------------
结果:<_sre.SRE_Match object; span=(3, 7), match='1233'>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import re
# I表示忽略大小写
p = re.compile(r'([a-z]+) ([a-z]+)',re.I)
m = p.match('I am really love you')
print(m)
-----------------------------------------------------------------
结果:<_sre.SRE_Match object; span=(0, 4), match='I am'>
查找
- search(str,[,pos[,endpos]]):在字符串中查找匹配,pos和endpos表示起始位置
- findall:查找所有
- finditer: 查找 返回一个iter结果
import re
p = re.compile(r'\d+')
m = p.findall("one1two2three34")
a = p.search("one1two2three34")
print(a)
print(m)
---------------------------------------------------------------------------
结果:<_sre.SRE_Match object; span=(3, 4), match='1'>
['1', '2', '34']
+++++++++++++++++++++++++++++++++++++++++++++++++++++
#替换
import re
p = re.compile(r'(\w+) (\w+)')
s = "hello 123 wang 123 xiao 456 jing, i love you"
rst = p.sub(r'hello world',s)
print(rst)
---------------------------------------
结果:hello world hello world hello world jing, hello world you
贪婪模式 *
非贪婪 ?
import re
title = '<div>name</div><div>age</div>'
p1 = re.compile(r"<div>.*</div>")
p2 = re.compile(r'<div>.*?</div>')
r1 = p1.match(title)
r2 = p2.search(title)
print(r1.group())
print(r2.group())
-----------------------------------------
结果:<div>name</div><div>age</div>
<div>name</div>
匹配中文
- 大部分中文的表示范围[u4e00-u9fa5] , 不包括全角标点
import re
title = u'世界你好 hello moto'
p = re.compile(r'[\u4e00-\u9fa5]+')
rst = p.findall(title)
print(rst)
-----------------------------
结果:['世界你好']
XPATH
-
在xml文件中查找信息的一套规则/语言 根据xml元素
-
开源的
xpath开发工具
- chrome: xpath helper
- xmlQuire
- FIrefox : Xpath Checker
选取节点
-
nodename: 选取此节点的所有子节点
-
/: 从根节点开始选取
-
//: 选取节点,不考虑位置
-
. :选取当前节点
-
… : 选取当前节点的父亲
-
@: 选取属性 //age[@detail] 或者 //div[@class=‘title’]
-
xpath中查找一般按照路径方法查找
-
/School/Student[1]
-
/School/Student[last()]
-
/School/Student[last()-1]
-
/School/Student[position()❤️] 前两个
-
//Student[@score]
-
//Student[@score=‘99’]
-
//STudent[@score]/Age
xpath的一些操作
- | : 或者
- 还有很多+ - * div < >