Python笔记:Python中的正则表达式基础入门

python 中简单的字符串查找

在python中我们可以使用字符串提供的find方法来匹配字符

str = 'ssdfsds2wwws'
str.find('www') # 存在 返回 8
str.find('xx') # 不存在  返回 -1

python中的正则re模块介绍

关于re模块

  • re模块是使Python语言拥有全部正则表达式功能,使用前需要使用import re导入此功能
  • compile 函数是根据一个模式字符串和可选的标志参数升恒一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换
  • re 模块也提供了这些方法功能完全一致的函数,这些函数使用一个模式字符串作为他们的第一个参数,如 search

以下通过 search、complie 两种方式进行匹配查找

import re

str = '123'
print(re.search('5', str)) # 查找不到返回 None
print(re.search('[0-9]', str)) # 中括号表示仅一位 0-9之间的数字 只用模糊查找 <_sre.SRE_Match object; span=(0, 1), match='1'>

# 使用 compile 的正则对象的search方法
pat = re.compile('[0-9]') # 此处封装一个对象
pat.search(str) # <_sre.SRE_Match object; span=(0, 1), match='1'>

python中的正则原子、元字符、模式修正符

正则原子

  • 原子是正则表达式中最基本的组成单位,每个正则表达式中至少包含一个原子。
  • 常见的原子类型有:
    • 普通字符作为原子 如:a b c 字母
    • 非打印字符作为原子 如:\n \t
    • 通用字符作为原子 如:\d \D \w \W \s \S
    • 原子表 如:多个原子拼接在一起
import re

# 查找数字
print(re.findall('\d', 'sddsssdfsss')) # []
print(re.findall('\d', 'sdds1ssdfsss')) # ['1']
print(re.findall('[0-9]', 'sdds1ssd2fsss')) # ['1', '2']
# 查找 非数字
print(re.findall('\D', 'sdds1ssd2fsss')) # ['s', 'd', 'd', 's', 's', 's', 'd', 'f', 's', 's', 's']
# []中括号的用法,或的查找
print(re.findall('[cba]', 'abcsdsdf')) # ['a', 'b', 'c']
# \s 空白符查找
print(re.findall("\s", "xxxdddsss")) # []
print(re.findall("\s", "xxx ddd\nsss")) # ['', '\n']

元字符

元字符是正则表达式中具有一些特殊含义的字符,比如重复N次前面的字符等,如下:

  • . 表示任意一个除换行符之外的字符, 常用组合 .*?, .+?
  • [xyz] []表示单个字符的原子表,此处表示 匹配 xyz的单个字符
  • [^xyz][]的取反操作, 表示除中括号内原子之外的任何字符
  • * 等价于 {0,} 匹配前面的子表达式零次或多次,可以省略不写
  • + 等价于 {1,} 匹配前面的表达式一次或多次
  • ? 等价于 {0,1}
  • {n} n是一个非负整数,匹配确定的n次。
  • {n,} 至少匹配n次
  • {n,m} n是一个非负整数,其中 n <= m。最少匹配n次,最多匹配m次。
  • \ 将一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。如:\n
  • ^ 表示以什么开头
  • $ 表示以什么结尾
  • | 表示或的意思
  • () 表示一个整体原子,并且还有一个子存储单元的作用,也可使用?:来拒绝子存储 (?:.*?)
  • 等等
import re

# 查找连续的三位数字
print(re.findall('\d\d\d', 'sd234sds123ds890')) # ['234', '123', '890']
print(re.findall('\d{3}', 'sd234sds123ds890')) # ['234', '123', '890']
print(re.findall('[0-9]{3}', 'sd234sds123ds890')) # ['234', '123', '890']
print(re.findall('[0-9]{2,3}', 's67d234sds123ds890')) # ['67', '234', '123', '890'] 此处是查找2位或3位的数字,注意2与3之间有一个紧挨着的,不能加空格
# 查找至少一位数字 {1,} 或 +
print(re.findall('[0-9]{1,}', '10s1d234sds123ds890')) # ['10', '1', '234', '123', '890']
print(re.findall('[0-9]+', '10s1d234sds123ds890')) # ['10', '1', '234', '123', '890']
print(re.findall('-?[0-9]+', '10s-1d-234sds123ds890')) # ['10', '-1', '-234', '123', '890'] 查找 带有负号的和不带负号的 ? 是可有可无的意思
# 查找零次或多次重复 * 或 {0,}
print(re.findall('[a]*', 'a12aa3aaa5')) # ['a', '', '', 'aa', '', 'aaa', '', '']
# 以...开头 ^
print(re.findall('^abc', 'abc123')) # ['abc']
print(re.findall('^abc', '1abc123')) # []
# 以...开头 ^ 以...结尾 $ 精确匹配
print(re.findall('^abc$', 'abc')) # ['abc']
print(re.findall('^abc$', 'abc1')) # []
# 匹配固定位数字母
print(re.findall("[a-z]{2}", "ssssewr12DDZ3")) # ['ss', 'ss', 'ew']
print(re.findall("[a-zA-Z]{2}", "ssssewr12DDZ3")) # ['ss', 'ss', 'ew', 'DD']

模式修正符

所谓模式修正符,即可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能。

  • re.I 使匹配对大小写不敏感
  • re.L 做本地化识别(locale-aware)匹配
  • re.M 多行匹配,影响 ^$
  • re.S 使 . 匹配包括换行在内的所有字符
  • re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B
  • re.X 该标志通过给与你更灵活的格式以便你将曾泽表达式写得更易于理解。
import re

# 使用模式修正符 可以更便捷 re.I 不区分大小写
print(re.findall("[a-z]{2}", "ssssewr12DDZ3", re.I)) # ['ss', 'ss', 'ew', 'DD']
# 匹配所有字符
print(re.findall(".+", "ssssewr12DDZ3")) # ['ssssewr12DDZ3']
# 存在\n的情况
print(re.findall(".+", "ssssewr\n12DDZ3")) # ['ssssewr', '12DDZ3']
# 去除换行的情况 re.S
print(re.findall(".+", "ssssewr\n12DDZ3", re.S)) # ['ssssewr\n12DDZ3']

贪婪模式与懒惰模式

  • 贪婪模式,即最大匹配,如:.*.+
  • 懒惰模式,即见好就收,如:.*?.+? 表示尽可能的少匹配
  • 懒惰模式比贪婪模式多一个?
import re

# .* 或 .+ 是最大匹配 就是贪婪模式
print(re.findall("<b>.*</b>", "<b>111</b><i>222</i><b>333</b>")) # ['<b>111</b><i>222</i><b>333</b>']
# .*? 懒惰模式
print(re.findall("<b>.*?</b>", "<b>111</b><i>222</i><b>333</b>")) # ['<b>111</b>', '<b>333</b>']
# 取出标签内容, 通过() 进行子存储过滤
print(re.findall("<b>(.*?)</b>", "<b>111</b><i>222</i><b>333</b>")) # ['111', '333']
发布了370 篇原创文章 · 获赞 169 · 访问量 66万+

猜你喜欢

转载自blog.csdn.net/Tyro_java/article/details/102877004