Python : comment traiter rapidement des chaînes à l'aide d'expressions régulières


avant-propos

1、正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

2、Python中我们经常用match、search、findall函数搭配使用快速获取关键字符串。


1. Expressions régulières

1. Explication détaillée des métacaractères

pattern:匹配的关键字

métacaractère décrire
\ Place le jeton de caractère suivant, ou une référence arrière, ou un échappement octal.
^ Correspond au début de la ligne d'entrée.
$ Correspond à la fin de la ligne d'entrée.
* Correspond à 0 ou plusieurs expressions. Exemple : L'expression zo* peut correspondre à "z", ainsi qu'à "zo" et "zoooo...". Parce que o peut valoir 0 ou plus.
+ Associez 1 ou plusieurs expressions. Exemple : L'expression zo+ peut correspondre à "zo" et "zoooo...", mais pas à "z". Parce que o a au moins 1.
? Correspond à 0 ou 1 expression. Exemple : l'expression zo ? Peut correspondre à "z" et "zo", car o peut exister 0 ou 1.
{n} Faites correspondre le caractère n fois. Exemple : L'expression o{2} peut correspondre à deux o dans "nourriture".
{n,} Faites correspondre un caractère au moins n fois. L'expression o{2,} peut correspondre à tous les o dans "foooood", mais ne peut pas correspondre à "o" dans "fod", car il n'y a qu'un seul o dans fod, et o{2,} nécessite plus de deux o.
{n,m} Faites correspondre les caractères au moins n fois et au plus m fois. Par exemple, l'expression o{1,3} peut correspondre à "fod", "food" et "foood", o existe 1 ou 3 fois.
? Lorsque ce caractère suit immédiatement l'un des autres qualificatifs (*,+, {n}, {n,}, {n,m}), le modèle correspondant est non gourmand. Le mode non gourmand correspond le moins possible à la chaîne recherchée, tandis que le mode gourmand par défaut correspond le plus possible à la chaîne recherchée. Par exemple, pour la chaîne "oooo", "o+" correspondra à autant de "o" que possible, résultant en ["oooo"], tandis que "o+?" correspondra à aussi peu de "o" que possible, résultant en ['o', 'o', 'o', 'o']
. Correspond à n'importe quel caractère unique sauf "\n" et "\r". Pour faire correspondre n'importe quel caractère, y compris "\n" et "\r", utilisez un modèle tel que "[\s\S]".
(modèle) Correspond au modèle et récupère cette correspondance.
(?:modèle) Correspondance sans acquisition, correspond au modèle mais n'obtient pas le résultat correspondant et ne le stocke pas pour une utilisation ultérieure.
(?=motif) Assertion d'anticipation, il y a un contenu de motif derrière la correspondance, par exemple : l'expression \S(?=vous), peut correspondre à "amour" dans "je t'aime", car "amour" est suivi de "vous", il est donc mis en correspondance avec succès . (\S signifie correspondre à n'importe quel caractère visible)
(?!modèle) Assertion d'anticipation négative, correspond au contenu sans motif après, par exemple : l'expression \S(?! Vous), ne peut pas correspondre au "amour" dans "Je t'aime", ce que je dois faire correspondre est le contenu sans "vous" après le caractère . (\S signifie correspondre à n'importe quel caractère visible)
(?<=motif) Assertion avant-arrière, correspond au contenu avec motif devant, par exemple : l'expression (?<=I)\S, peut correspondre à "l'amour" dans "je t'aime", car "l'amour" a "je" devant, il est donc mis en correspondance avec succès . (\S signifie correspondre à n'importe quel caractère visible)
(?<!motif) Assertion de regard en arrière négative, correspond au contenu sans motif devant, par exemple : l'expression \S(?!I), ne peut pas correspondre au "amour" dans "Je t'aime", ce que je dois faire correspondre est le contenu sans "I" après le caractère . (\S signifie correspondre à n'importe quel caractère visible)
x|y Faites correspondre x ou y. Par exemple, l'expression "z|food" correspond à "z" ou "food" (faites attention ici). "[z|f]ood" correspond à "zood" ou "nourriture".
[xyz] collection de personnages. Correspond à l'un des caractères contenus. Par exemple, "[abc]" correspondrait au "a" dans "plain".
[^xyz] Jeu de caractères négatif. Correspond à tout caractère non contenu. Par exemple, "[^abc]" peut correspondre à n'importe quel caractère de "plin" dans "plain".
[az] gamme de caractères. Correspond à n'importe quel caractère dans la plage spécifiée. Par exemple, "[az]" correspond à n'importe quel caractère alphabétique minuscule dans la plage "a" à "z".
[^az] Une plage de caractères négative. Correspond à tout caractère arbitraire non compris dans la plage spécifiée. Par exemple, "[^az]" correspond à tout caractère qui n'est pas compris entre "a" et "z".
\b Faites correspondre la limite d'un mot, c'est-à-dire la position entre le mot et l'espace (c'est-à-dire qu'il existe deux concepts de "correspondance" dans les expressions régulières, l'un est le caractère correspondant et l'autre est la position correspondante, où \b est la position correspondante). Par exemple, "er\b" peut correspondre à "er" dans "jamais", mais pas à "er" dans "verbe" ; "\b1_" peut correspondre à "1_" dans "1_23", mais pas à "1_" dans "21_3".
\B Correspond aux limites des non-mots. "er\B" correspond à "er" dans "verbe", mais pas à "er" dans "jamais".
\d Correspond à un caractère numérique. Équivalent à [0-9].
\D Correspond à un caractère non numérique. Équivalent à [^0-9].
\F Correspond à un caractère de saut de page.
\n Correspond à un caractère de saut de ligne.
\r Correspond à un retour chariot.
\s Correspond à n'importe quel caractère invisible, y compris les espaces, les tabulations, les sauts de page, etc.
\S Correspond à n'importe quel caractère visible.
\t Correspond à un caractère de tabulation.
\v Correspond à un caractère de tabulation verticale.
\w Correspond à n'importe quel caractère de mot, y compris un trait de soulignement. Similaire mais non équivalent à "[A-Za-z0-9]", où les caractères "mot" utilisent le jeu de caractères Unicode.
\W Correspond à n'importe quel caractère autre qu'un mot. Équivalent à "[^A-Za-z0-9_]".
\num Correspond à num, où num est un entier positif. Une référence au hit qui a été récupéré. Par exemple, "(.)\1" correspond à deux caractères identiques consécutifs.
\n Identifie une valeur d'échappement octale ou une référence arrière. Si \n est précédé d'au moins n sous-expressions extraites, alors n est une référence arrière. Sinon, si n est un chiffre octal (0-7), alors n est une valeur d'échappement octale.
< > Correspond au début (<) et à la fin (>) d'un mot. Par exemple, l'expression régulière <le> peut correspondre à "le" dans la chaîne "pour le sage", mais pas à "le" dans la chaîne "autrement". Remarque : Ce métacaractère n'est pas pris en charge par tous les logiciels.
( ) 将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。
| 将两个匹配条件进行逻辑“或”(or)运算。

2、等价方法(速记)

一、等价:
等价是等同于的意思,表示同样的功能,用不同符号来书写。
?,*,+,\d,\w 都是等价字符
?等价于匹配长度{
    
    0,1}
*等价于匹配长度{
    
    0,}
+等价于匹配长度{
    
    1,}
\d等价于[0-9]
\D等价于[^0-9]
\w等价于[A-Za-z_0-9]
\W等价于[^A-Za-z_0-9]。

二、常用运算符与表达式:
^ 开始
()域段
[] 包含,默认是一个字符长度
[^] 不包含,默认是一个字符长度
{
    
    n,m} 匹配长度
. 任何单个字符(\. 字符点)
| 或
\ 转义
$ 结尾
[A-Z] 26个大写字母
[a-z] 26个小写字母
[0-9] 09数字
[A-Za-z0-9] 26个大写字母、26个小写字母和09数字

二、常用的表达式

1、常用的正则表达式

常见的正则表达式

1.验证用户名和密码:("[a-zA-Z]\w{5,15}")正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位;
2.验证电话号码:("(\d{3,4}-)\d{7,8}")正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
3.验证手机号码(包含虚拟号码和新号码段):"1([38][0-9]|4[5-9]|5[0-3,5-9]|66|7[0-8]|9[89])[0-9]{8}"4.验证身份证号(15位):"\d{14}[[0-9],0-9xX]",(18位):"\d{17}(\d|X|x)"5.验证Email地址:("\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*")6.只能输入由数字和26个英文字母组成的字符串:("[A-Za-z0-9]+")7.整数或者小数:[0-9]+([.][0-9]+){
    
    0,1}
8.只能输入数字:"[0-9]*"9.只能输入n位的数字:"\d{n}"10.只能输入至少n位的数字:"\d{n,}"11.只能输入m~n位的数字:"\d{m,n}"12.只能输入零和非零开头的数字:"(0|[1-9][0-9]*)"13.只能输入有两位小数的正实数:"[0-9]+(\.[0-9]{2})?"14.只能输入有1~3位小数的正实数:"[0-9]+(\.[0-9]{1,3})?"15.只能输入非零的正整数:"\+?[1-9][0-9]*"16.只能输入非零的负整数:"\-[1-9][0-9]*"17.只能输入长度为3的字符:".{3}"18.只能输入由26个英文字母组成的字符串:"[A-Za-z]+"19.只能输入由26个大写英文字母组成的字符串:"[A-Z]+"20.只能输入由26个小写英文字母组成的字符串:"[a-z]+"21.验证是否含有^%&',;=?$\"等字符:"[%&',;=?$\\^]+"。
22.只能输入汉字:"[\u4e00-\u9fa5]{0,}"23.验证URL:"http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?"24.验证一年的12个月:"(0?[1-9]|1[0-2])"正确格式为:"01""09""10""12"25.验证一个月的31天:"((0?[1-9])|((1|2)[0-9])|30|31)"正确格式为;"01""09""10""29"和“30~31”。
26.获取日期正则表达式:\\d{
    
    4}[|\-|\.]\d{
    
    \1-\12}[|\-|\.]\d{
    
    \1-\31}?
评注:可用来匹配大多数年月日信息。
27.匹配双字节字符(包括汉字在内)[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计128.匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
29.匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</>|<.*? />
30.匹配首尾空白字符的正则表达式:\s*|\s*
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
31.匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
32.匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)[a-zA-Z][a-zA-Z0-9_]{
    
    4,15}
评注:表单验证时很实用
33.匹配腾讯QQ号:[1-9][0-9]{
    
    4,}
34.匹配中国邮政编码:[1-9]\\d{
    
    5}(?!\d)
评注:中国邮政编码为6位数字
35.匹配ip地址:([1-9]{
    
    1,3}\.){
    
    3}[1-9]。
评注:提取ip地址时有用
36.匹配MAC地址:([A-Fa-f0-9]{
    
    2}\:){
    
    5}[A-Fa-f0-9]
37.匹配括号内的内容(懒惰匹配):\((.*?)\)
38.匹配括号内的内容(贪婪匹配):\((.*)\)

2、先行断言和后行断言

在使用正则表达式的过程中发现先行断言和后行断言比较好用,但是也比较难理解,这里刚好做一下解释。

1)正向先行断言:(?=pattren)
正向先行断言,匹配后面有pattren的内容。

如何匹配python yyds,what is the python第一个python?这时可以用到正向先行断言。

在这里插入图片描述

根据上图,因为第一个python 的后面紧接着yyds,因此直接使用.*(?=yyds),就能直接匹配到第一个python


2)负向先行断言:(?!pattren)
负向先行断言,匹配后面没有pattren的内容。

如何匹配python yyds,what is the pycharm含有py的pycharm,这时可以用到负向先行断言。

在这里插入图片描述根据上图,py后面没有thon的只有pycharm


3)正向后行断言:(?<=pattren)
正向后行断言,匹配前面有pattren的内容。
如何匹配python yyds,what is the pycharm前面有python的内容,这时可以用到正向后行断言。

在这里插入图片描述
根据上图,前面有python的字符串为 yyds,what is the pycharm


4)负向后行断言:(?<!pattren)

负向后行断言,匹配字符串前面没有pattren的内容。
如何匹配python yyds,what is the pycharm yyds前面没有python 的yyds,这时可以用到负向后行断言。

在这里插入图片描述

根据上图,前面没有python的yyds为pycharm之后的yyds


.*是匹配所有(除换行符外)的所有字符串。

三、Python匹配函数

注:使用这三个函数需要使用re库

1、Match函数

1)re.match函数介绍
re.match从字符串的起始位置开始匹配,如果没有在起始位置匹配成功的话则会返回None。

import re

#如果成功匹配字符串会返回一个对象,如果没有则会返回None;
matchobj = re.match(pattern,string,flags=0)

参数
1)pattern:匹配的正则表达式
2)string:需要匹配的字符串
3)flags参数:标志位,用于选择正则表达式的匹配方式(大小写,多行匹配)
re.I 忽略大小写
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M 多行模式
re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
re.X 为了增加可读性,忽略空格和#后面的注释


#返回结果的调用方法
matchobj.groups()
matchobj.group(num=0)
matchobj.span()

2)re.match函数方法案例

import re

#re.match方法
#注意1:group用法
string="python yyds"
matchobj = re.match("python",string)
print(matchobj.group(0))
>>>python

#注意2:需要从字符串开始的地方匹配
string="python yyds"
matchobj = re.match("yyds",string)
print(matchobj.group(0))
>>>AttributeError: 'NoneType' object has no attribute 'group'
#re.match是从字符串的起始位置开始匹配,如果字符串开始未匹配到字符串,则会报错。

#注意3:需要优化一下
string="python yyds"
matchobj = re.match("Python",string,re.I)
#如果没有匹配到结果就使用matchobj.group(0)属性报错。
if matchobj:
	print(matchobj.group(0))

#注意4:flags大小写设置
string="python yyds"
matchobj = re.match("Python",string,re.I)
if matchobj:
	print(matchobj.group(0))
>>>python
#这里匹配到了python,因为re.I忽略大小写匹配。

2、Search函数

1)Search函数介绍
re.search扫描整个字符串并返回第一个成功的匹配;re.search和re.match的区别在于re.match只匹配字符串的开始,如果开始匹配不上,则匹配失败;而re.search从任何地方找。

import re

#同样的正则表达式,看看re.match和re.search的区别

#re.match
string="python yyds"
matchobj = re.match("yyds",string)
if matchobj:
	print(matchobj.group(0))
>>>AttributeError: 'NoneType' object has no attribute 'group'
#re.match是从字符串的起始位置开始匹配,如果字符串开始未匹配到字符串,则会报错。

#re.search
string="python yyds"
matchobj = re.search("yyds",string)
if matchobj:
	print(matchobj.group(0))
>>>yyds

3、Findall函数

1)Findall函数介绍
re.findall会返回所有匹配到的结果,匹配的结果为列表(,re.findall与search、match的区别在于:search和match是一次匹配,找到后返回匹配对象;而findall则会多次匹配,返回匹配列表。

import re

string = "python is the best language,python yyds"
matchobj = re.findall("python",string)
if matchobj is not None:
	print(matchobj)
	print(matchobj[0])
>>>['python', 'python']
>>>python

四、regex101网站推荐

在这个网站可以输入正则表达式来匹配函数,能够快速匹配到结果,非常好用。

点击进入regex101网站

在这里插入图片描述


Je suppose que tu aimes

Origine blog.csdn.net/zataji/article/details/128356853
conseillé
Classement