python-re正则表达式详解

python —正则表达式应用

官方文档链接:https://docs.python.org/zh-cn/3/library/re.html


正则文档及测试工具

正则表达式字符解释文档分享:
链接:https://pan.baidu.com/s/1NQVNEyg1VhAPx_aLmLlAFA
提取码:gsue
内容样式:
在这里插入图片描述


正则表达式测试工具分享:
链接:https://pan.baidu.com/s/1Smn65HVXcpS6H3Bes9VjvQ
提取码:6j6w


表达式字符说明

一般字符

·匹配任意除换行符"\n"外的字符。 在DOTALL模式中也能匹配换行符。
\转义字符,使用一个字符改变原来的意思。 如果字符串中有字符需要匹配,可以使用*或者字符集[]。
[…]字符集(字符类)。对应的位置可以是字符集中任意的字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。第一个字符如果是则表示取反,如[abc]表示不是abc的其他字符。所有特殊字符在字符集中都是去起原有的特殊含义。在字符集中如果使用]、-、或,可以在前面加上反斜杠,或把]、-放在第一个字符,把放在非第一个字符上。

预定义字符集

可以写在字符集[…]中

\d数字:[0-9]
\D非数字:[^\d]
\s空白字符[<空格>\t\r\n\f\v]
\S[^\s]
\w[A-Za-z0-9]
\W[^\w]

数量词

用在字符或(…)之后

*匹配前一个字符0或无限次
+加匹配前一个字符1次或无限次
匹配前一个字符0次或1次
{m}匹配前一个字符m次
{m,n}匹配前一个字符m至n次 m和n可以省略:若省略m,则匹配0至n次;若省略n则匹配m至无限次
*? +? {m,n}?使用*?,+?,{m,n}?变成非贪婪模式。 后面带上问号?

边界匹配

不消耗待匹配字符串中的字符

^匹配字符串开头 在多行模式中匹配每一行的开头
$匹配字符串的末尾 在多行模式中匹配每一行的末尾
\A仅匹配字符串开头
\Z仅匹配字符串末尾
\b匹配\w和\W之间
\B[^\b]

逻辑、分组

||代表左右表达式任意匹配一个。 它总是先尝试匹配左边的表达式,一旦成功匹配则跳过匹配右边的表达式。如果|没有被包括在()中,则它的范围是整个正则表达式。
(…)被括起来的表达式将作为分组,从表达式左边开始没遇到一个分组在做括号‘(’,编号+1。另外,分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效。
(?P…)分组,除了原有的编号外在制定一个额外的别名。
<number>引用编号的分组匹配到字符串。
(?P = name)引用别名为的分组匹配到的字符串

特殊构造(不作为分组)

(?:…)(…)的不分组版本,用来使用‘|’或后接数量词。
(?iLmsux)iLmsux的每个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个。
(?#…)#后的内容将作为注释被忽略
(?=…)之后的字符串内容需要匹配表达式才能成功匹配。 不消耗字符串内容
(?!..)之后的字符串内容需要不匹配表达式才能成功匹配。 不消耗字符串内容
(?<!..)之前的字符串内容需要不匹配表达式才能成功匹配。 不消耗字符串内容
(?<=…)之前的字符串内容需要匹配表达式才能成功匹配。 不消耗字符串内容
(?(id/name)) yes-pattern |no-pattern)如果编号为id/别名为name的组匹配到字符,则需要匹配yes-pattern,否则需要匹配no-pattern。 |no-pattern可以省略。

常用函数:

re.compile:正则编译

re.compile(pattern,flags=0)
正则表达式预先编译,多字符串匹配时,直接调用该对象,可以减少正则重复编译,节省时间。

  • pattern:正则表达式,同时应用不同的pattern可以使用|分隔,比如pattern = ‘体重\d+ | 身高\d+’
  • flags:译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。

常用flags参数:多个flags参数使用竖杠分隔,比如flags =re.S | re.I

  • re.S(DOTALL):使.匹配包括换行在内的所有字符(正常是不能匹配到换行\n的);
  • re.I(IGNORECASE):使匹配对大小写不敏感;
  • re.L(LOCALE):做本地化识别(locale-aware)匹配,法语等;
  • re.M(MULTILINE):多行匹配,影响^和$;
  • re.X(VERBOSE):该标志通过给予更灵活的格式以便将正则表达式写得更易于理解;
  • re.U:根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B)。)

也可以在表达式前面加上(?i),不区分大小写,比如(?i)regexp匹配Regexp;表达式中‹(?i)›后面的字符不区分大小写,而‹(?-i)›后面的字符重新区分大小写;
匹配所有字符,可以使用点+re.S,也可以使用诸如[\s\S][\d\D][\w\W]

re.search:查找

re.search(pattern,string,flags=0)
查找符合正则表达式第一次出现的字符串,如果有多段字符符合表达式的,只会返回第一段字符。如果没匹配到,返回None,匹配成功,就是一个match object对象。

  • match object方法
  • group() 返回被 RE 匹配的字符串,返回完全匹配的文本
  • start() 返回匹配开始的位置
  • end() 返回匹配结束的位置
  • span() 返回一个元组包含匹配 (开始,结束) 的位置
  • group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
  • group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常,m.group(1)返回第一个括号分组内匹配的文本。
  • groups() 该方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。
s = '小明身高180厘米,体重70kg'
r = re.search('(?<=身高)(\d+).+(?<=体重)(\d+)',s)
r.group()
#out:'180厘米,体重70'
r.group(1)
#out:'180'
r.group(2)
#out:'70'
r.groups()
#out:('180', '70')
r.start()
#out:4,左闭右开,匹配开始位置从0开始在位置4
r.end()
#out:14,右开(不包括),匹配结束位置在14

re.findall:查找所有

re.findall(pattern,string,flags=0)
找到所有匹配对象,返回字符串列表,没匹配到,返回空列表。需要注意的一点是,如果有括号分组的情况下,只会返回表达式分组匹配的内容。

import re
s = '小明身高180厘米,体重70kg'
re.findall('(?<=身高)(\d+).+(?<=体重)(\d+)',s)
#out:[('180', '70')];返回一个匹配元素,里边有两个分组。

'''使用complile预先编译的写法,其他也可以使用该方法,无须再传入pattern参数。'''
reg_bat = re.compile((?<=身高)(\d+).+(?<=体重)(\d+))
reg_bat.findall(s)

re.sub:替换

re.sub(pattern, repl, string, count=0, flags=0)
把符合正则表达式的内容替换成目标repl内容。需要注意的是,如果需要保留分组(表达式有小括号)内容,repl参数里边直接传入分组引用序号就行。比如:‘\1’。如果没没有找到替换字符串,则返回原字符串。

  • 必选参数:pattern, repl, string。repl可以是被替换的字符串或者函数
  • 可选参数:count, flags;count存在多条匹配记录时,替换次数。
s = '小明身高180厘米,体重70kg'

'''隐藏小明身高和体重信息'''
re.sub('(?<=身高)\d+|(?<=体重)\d+','**',s)
#out:'小明身高**厘米,体重**kg'

re.split:分割

re.split(pattern, string, maxsplit=0, flags=0)
使用符合正则表达式字符作为分隔符分割字符串

  • 注意:如果在 pattern 中捕获到括号,那么所有的组里的文字也会包含在列表里。如果 maxsplit 非零, 最多进行 maxsplit 次分隔, 剩下的字符全部返回到列表的最后一个元素。
header = '姓名,成绩|身高\t 体重'
re.split('[,|]|\t ',header)
#out:['姓名', '成绩', '身高', '体重']

'''pat带有括号,包括分隔符在在输出列表里边。'''
re.split('(,|\||\t )',header)
#out:['姓名', ',', '成绩', '|', '身高', '\t ', '体重']

特殊元字符

任何不包含如下这些字符的正则表达式都可以简单地匹配其自身:$()*+.?[\^{|

这个列表中并不包含右方括号、连字号-和右花括号}。前两个符号只有在它们位于一个没有转义的[之后才成为元字符,而}只有在一个没有转义的{之后才是元字符。在任何时候都没有必要对}进行转义。

[]号表示范围,[a-zA-Z0-9],前面带^表示取反,比如[^a-z]表示不包括小写字母a到z,^在方括号中间没有特别意义;
反向的写法不允许,比如[z-a]
方括号中也可以使用\d,\D,\W,\w,\S,\s,比如[a-zA-Z\d][a-zA-Z0-9]是等同的;

不可打印字符

表示含义十六进制
<\a>振铃0x07
<\e>转义0x1B
<\f>换页0x0C
<\n>换行0x0A
<\r>回车0x0D
<\t>水平制表符0x09
<\v>垂直制表符0x0B

使用十六进制ASCII编码匹配制表符:re.search(string='\t',pattern='\x09')

匹配之前已匹配的文本

使用分组,分组的匹配顺序从左往右,从外往里,第一个分组使用\1标记,示例如下,\4匹配到的是第4个分组09;
re.findall(string="2021-09-01-09",pattern=r"((\d\d\d\d)-((\d\d)-(\d\d)))-(\4)")

[(‘2021-09-01’, ‘2021’, ‘09-01’, ‘09’, ‘01’, ‘09’)]

使用Unicode匹配(汉字)

Unicode 是全球文字统一编码。它把世界上的各种文字的每一个字符指定唯一编码,实现跨语种、跨平台的应用。

中文用户最常接触的是汉字 Unicode 编码。中文字符数量巨大,日常使用的汉字数量有数千个,再加上生僻字,数量达到数万个。这个表格将中文字符集的 Unicode 编码范围列出,点击字库条目可见具体字符。若要查询具体字符的编码请前往:汉字字符集编码查询。

匹配基本汉字:re.findall(string="asdrf匹配基本汉字125",pattern="[\u4E00-\u9FA5]")

[‘匹’, ‘配’, ‘基’, ‘本’, ‘汉’, ‘字’]

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值