python 正则匹配

在python 中,正则匹配用到的还是挺多的,下面总结一下常用的一些正则匹配:

精确匹配:

\d可以匹配一个数字,

\w可以匹配一个字母或数字,

. 匹配任意的单个字符

\s可以匹配一个空格(也包括Tab等空白符)

变长匹配:

{N} 重复前面的单个字符N次出现

{a,b}  重复前面的单个字符出现次数的范围在a-b次,例如:\d{3,8}   表示任意个字符(包括0个)

* 表示任意个字符(包括0个)

+ 至少有一个,即一个或多个

[  ]   方括号中的内容是以拆分为单个的形式,只要方括号中的出现任意一个就会匹配上

A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'

^表示行的开头,^\d表示必须以数字开头。

$表示行的结束,\d$表示必须以数字结束。

py也可以匹配'python',但是加上^py$就变成了整行匹配,就只能匹配'py'了。

 

准备知识完成,在python中的正则匹配的使用模块主要是re模块:

在使用python的re模块,导包:

import  re

在编写某些正则的时候,有时候需要转义,为了我们可以在编写正则匹配体的时候,加前缀就不用考虑转义的问题了:

a="^py\\001&"b=r"^py\001&"
#都是表示匹配'^py\001&'

正则表达式修饰符 - 可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

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

re模块用法:

match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。常见的判断方法就是:

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none

匹配成功re.match方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

test = '用户输入的字符串'
if re.match(r'正则表达式', test):print('ok')
else:print('failed')

re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。

函数语法:

re.search(pattern, string, flags=0)

匹配成功re.search方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

检索和替换

Python 的 re 模块提供了re.sub用于替换字符串中的匹配项,返回替换后的字符串

语法:

re.sub(pattern, repl, string, count=0, flags=0)

参数:

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配

分组

除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如:

^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:

>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'

group(0)永远是原始字符串,group(1)group(2)……表示第1、2、……个子串

贪婪匹配

最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0

>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')

由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。

必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:

>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')

 

本文链接:https://my.lmcjl.com/post/15286.html

展开阅读全文

4 评论

留下您的评论.