Python: Como processar rapidamente strings usando expressões regulares


prefácio

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

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


1. Expressões regulares

1. Explicação detalhada dos metacaracteres

pattern:匹配的关键字

metacaractere descrever
\ Coloca o próximo token de caractere, ou uma referência inversa, ou um escape octal.
^ Corresponde ao início da linha de entrada.
$ Corresponde ao final da linha de entrada.
* Corresponde a 0 ou mais expressões. Exemplo: A expressão zo* pode corresponder a "z", assim como "zo" e "zoooo...". Porque o pode ser 0 ou mais.
+ Combine 1 ou mais expressões. Exemplo: A expressão zo+ pode corresponder a "zo" e "zoooo...", mas não a "z". Porque o tem pelo menos 1.
? Corresponde a 0 ou 1 expressão. Exemplo: a expressão zo? Pode corresponder a "z" e "zo", porque o pode existir 0 ou 1.
{n} Corresponde ao caractere n vezes. Exemplo: a expressão o{2} pode corresponder a dois o's em "comida".
{n,} Corresponde a um caractere pelo menos n vezes. A expressão o{2,} pode corresponder a todos os o em "foooood", mas não pode corresponder a "o" em "fod", porque há apenas um o em fod e o{2,} requer mais de dois o.
{n,m} Corresponde caracteres pelo menos n vezes e no máximo m vezes. Por exemplo, a expressão o{1,3} pode corresponder a "fod", "food" e "foood", o existe 1 ou 3 vezes.
? Quando esse caractere segue imediatamente qualquer um dos outros qualificadores (*,+, {n}, {n,}, {n,m}), o padrão correspondente é não guloso. O modo não guloso corresponde o mínimo possível à string pesquisada, enquanto o modo ganancioso padrão corresponde o máximo possível à string pesquisada. Por exemplo, para a string "oooo", "o+" corresponderá ao maior número possível de "o", resultando em ["oooo"], enquanto "o+?" corresponderá ao menor número possível de "o", resultando em ['o', 'o', 'o', 'o']
. Corresponde a qualquer caractere único, exceto "\n" e "\r". Para corresponder a qualquer caractere, incluindo "\n" e "\r", use um padrão como "[\s\S]".
(padrão) Corresponde ao padrão e recupera esta correspondência.
(?:padrão) Correspondência de não aquisição, corresponde ao padrão, mas não obtém o resultado correspondente e não o armazena para uso posterior.
(?=padrão) Forward lookahead assertion, há conteúdo de pattren atrás da correspondência, por exemplo: a expressão \S(?=you), pode combinar "love" em "I love you", porque "love" é seguido por "you", então é correspondido com sucesso . (\S significa corresponder a qualquer caractere visível)
(?!padrão) Asserção lookahead negativa, casa com o conteúdo sem pattren depois dele, por exemplo: a expressão \S(?! You), não pode casar com o "amor" em "eu te amo", o que eu preciso casar é o conteúdo sem "você" depois do caractere . (\S significa corresponder a qualquer caractere visível)
(?<=padrão) Afirmação regressiva para frente, corresponde ao conteúdo com pattren na frente, por exemplo: a expressão (?<=I)\S, pode corresponder ao "amor" em "eu te amo", porque "amor" tem "eu" na frente, portanto é correspondido com sucesso . (\S significa corresponder a qualquer caractere visível)
(?<!padrão) Asserção lookbehind negativa, corresponde ao conteúdo sem padrão na frente, por exemplo: a expressão \S(?!I), não pode corresponder ao "amor" em "eu te amo", o que preciso corresponder é o conteúdo sem "I" após o caractere . (\S significa corresponder a qualquer caractere visível)
x|y Combine x ou y. Por exemplo, a expressão "z|food" corresponde a "z" ou "food" (tenha cuidado aqui). "[z|f]ood" corresponde a "zood" ou "food".
[xyz] coleção de personagens. Corresponde a qualquer um dos caracteres contidos. Por exemplo, "[abc]" corresponderia a "a" em "simples".
[^xyz] Conjunto de caracteres negativos. Corresponde a qualquer caractere não contido. Por exemplo, "[^abc]" pode corresponder a qualquer caractere em "plin" em "plain".
[az] gama de caracteres. Corresponde a qualquer caractere no intervalo especificado. Por exemplo, "[az]" corresponde a qualquer caractere alfabético minúsculo no intervalo de "a" a "z".
[^az] Um intervalo de caracteres negativos. Corresponde a qualquer caractere arbitrário que não esteja no intervalo especificado. Por exemplo, "[^az]" corresponde a qualquer caractere que não esteja no intervalo de "a" a "z".
\b Corresponde ao limite de uma palavra, ou seja, a posição entre a palavra e o espaço (ou seja, existem dois conceitos de "correspondência" em expressões regulares, um é o caractere correspondente e o outro é a posição correspondente, onde \b é a posição correspondente). Por exemplo, "er\b" pode corresponder a "er" em "nunca", mas não a "er" em "verbo"; "\b1_" pode corresponder a "1_" em "1_23", mas não a "1_" em "21_3".
\B Corresponde aos limites não-palavra. "er\B" corresponde a "er" em "verbo", mas não a "er" em "nunca".
\d Corresponde a um caractere numérico. Equivalente a [0-9].
\D Corresponde a um caractere não numérico. Equivalente a [^0-9].
\f Corresponde a um caractere de feed de formulário.
\n Corresponde a um caractere de nova linha.
\r Corresponde a um retorno de linha.
\s Corresponde a qualquer caractere invisível, incluindo espaços, tabulações, feeds de formulário, etc.
\S Corresponde a qualquer caractere visível.
\ t Corresponde a um caractere de tabulação.
\v Corresponde a um caractere de tabulação vertical.
\c Corresponde a qualquer caractere de palavra, incluindo um sublinhado. Semelhante, mas não equivalente a "[A-Za-z0-9]", onde os caracteres "palavra" usam o conjunto de caracteres Unicode.
\C Corresponde a qualquer caractere que não seja de palavra. Equivalente a "[^A-Za-z0-9_]".
\num Corresponde a num, onde num é um número inteiro positivo. Uma referência ao hit que foi buscado. Por exemplo, "(.)\1" corresponde a dois caracteres idênticos consecutivos.
\n Identifica um valor de escape octal ou uma referência anterior. Se \n for precedido por pelo menos n subexpressões buscadas, então n é uma referência inversa. Caso contrário, se n for um dígito octal (0-7), então n é um valor de escape octal.
< > Corresponde ao início (<) e ao fim (>) de uma palavra. Por exemplo, a expressão regular <the> pode corresponder a "the" na string "for the wise", mas não a "the" na string "caso contrário". Nota: Este metacaractere não é suportado por todos os softwares.
( ) 将( 和 ) 之间的表达式定义为“组”(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网站

在这里插入图片描述


Acho que você gosta

Origin blog.csdn.net/zataji/article/details/128356853
Recomendado
Clasificación