Python高级语法——正则表达式和XPath——学习心得笔记

Python 全栈工程师核心面试 300 问深入解析(2020 版)----全文预览

Python 全栈工程师核心面试 300 问深入解析(2020 版)----欢迎订阅

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个由前面的正则表达式定义的片段,非贪婪方式

    • 参考以下文章
      http://www.runoob.com/regexp/regexp-syntax.html
      http://www.runoob.com/python3/python3-reg-expressions.html
  • 字符匹配
    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的区别

    • 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'
name
age
' # .匹配除换行符(\n、\r)之外的任何单个字符 # 贪婪模式 p1 = re.compile(r'
.*
') # 非贪婪模式 p2 = re.compile(r'
.*?
') 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 选取此节点的所有子节点。
    • / 从根节点选取。
    • // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
    • . 选取当前节点。
    • … 选取当前节点的父节点。
    • @ 选取属性。

你可能感兴趣的:(Python高级语法,正则表达式,XPath)