Python高级语法——正则表达式和XPath——学习心得笔记
1. 正则表达式(Regular Expression)
-
正则表达式(Regular Expression)是一种文本模式
-
包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")
-
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串
-
常常用来检索,替换某些模式的文本
-
正则表达式写法
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[…] 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’
[^…] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 -
字符匹配
python 匹配 “python”. -
字符类
实例 描述
[Pp]ython 匹配 “Python” 或 “python”
rub[ye] 匹配 “ruby” 或 “rube”
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。类似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了数字外的字符 -
特殊字符类
实例 描述
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
\W 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。
2. Python3中的正则表达式
- RE使用大致步骤
- compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式pattern对象
- 通过pattern对象提供一系列的方法对文本进行查找匹配,获得匹配结果,一个match对象
- 最后通过match对象提供的属性和方法获得信息,根据需要进行下一步操作
- re常用函数
- 看文章http://www.runoob.com/python3/python3-reg-expressions.html
- compile 函数用于编译正则表达式
- 生成一个正则表达式( Pattern )对象
- 供 match() 和 search() 这两个函数使用
- re.match函数
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.match(pattern, string, flags=0) - re.search 扫描整个字符串并返回第一个成功的匹配
re.search(pattern, string, flags=0) - group() 或 groups() 匹配对象函数来获取匹配表达式
- re.sub用于替换字符串中的匹配项
re.sub(pattern, repl, string, count=0) - start() 返回匹配开始的位置
- end() 返回匹配结束的位置
- span() 返回一个元组包含匹配 (开始,结束) 的位置
- 直接看实例36_1/2/3.py
36_1
# 导入正则表达式的包
import re
# 查找数字
# 编写一个正则表达式的对象
pattern = re.compile(r'\d+') # 用于匹配至少一个数字
p = pattern
m = p.match('d2kjf349jfd39fak4j42j') # 查找头部,没有匹配
print(m)
m = p.match('d2kjf349jfd39fak4j42j', 5, 15) # 从第6个字符开始匹配到第15个字符结束
# 查找的结果只包含第一次成功的对象,打印出来是349,从第6个开始到第9个截止
print(m)
# 取出匹配到的元素
print(m[0])
print(m.group())
# 打出找出的元素开始和结束的位置
print(m.start(0))
print(m.end(0))
print(m.span(0))
36_2
import re
# re.I忽略大小写
# 两个组,两个组中间有一个空格
p = re.compile(r'([a-z]+) ([a-z]+)', re.I)
m = p.match("I am really love wangxiaojing")
print(m)
# 打印出匹配到的所有对象
print(m.groups())
# 给的参数为0,默认是匹配到的对象,整个组
print(m.group(0))
print(m.start(0))
print(m.end(0))
print(m.span(0))
# 参数为1,组中的第一个对象
print(m.group(1))
print(m.start())
print(m.end(1))
print(m.span(1))
36_3
import re
# 寻找数字
p = re.compile(r'\d+')
m = p.search("one12dfe1266edaf3")
print(type(m))
print(m)
# 查找所有
rst = p.findall("one12dfe1266edaf3")
print(type(rst))
print(rst)
# sub替换案例
phone = "2004-959-559 # 这是一个电话号码"
# 删除注释
num = re.sub(r'#.*$', "", phone)
print("电话号码 : ", num)
# 移除非数字的内容
num = re.sub(r'\D', "", phone)
print("电话号码 : ", num)
-
re.match和re.search的区别
扫描二维码关注公众号,回复: 4935968 查看本文章- re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;
- 而re.search匹配整个字符串,直到找到一个匹配。
-
匹配中文
- 大部分中文内容表示范围是[u4e00-u9fa5]
- 看案例36_4
36_4
import re
title = '世界 你好,hello world'
# 匹配中文字符
p = re.compile(r'[\u4e00-\u9fa5]+')
rst = p.findall(title)
print(rst)
# 贪婪和非贪婪
title = u'<div>name</div><div>age</div>'
# .匹配除换行符(\n、\r)之外的任何单个字符
# 贪婪模式
p1 = re.compile(r'<div>.*</div>')
# 非贪婪模式
p2 = re.compile(r'<div>.*?</div>')
m1 = p1.search(title)
print(m1)
print(m1.group())
print(m1.groups())
m2 = p2.search(title)
print(m2)
print(m2.group())
print(type(m2.groups()))
- 贪婪和非贪婪
- 贪婪:尽可能多的匹配(*)表示
- 非贪婪:找到符合条件的最小内容即可,(?)表示
- 正则默认使用贪婪匹配
3. XPath
-
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
-
XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。
-
参考博客
http://www.w3school.com.cn/xpath/index.asp
http://www.w3school.com.cn/xpath/xpath_syntax.asp -
语法
- nodename 选取此节点的所有子节点。
- / 从根节点选取。
- // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
- . 选取当前节点。
- … 选取当前节点的父节点。
- @ 选取属性。