正则表达式入门:从 “看不懂” 到 “会用” 的超详细指南

<font color="#FF8C0" size=6 face="华文楷体">正则表达式:文本处理的 “瑞士军刀”</font>

正则表达式(Regular Expression,简称 Regex)是一种用于描述字符串模式的工具,它通过预定义的规则来匹配、查找、替换或提取文本中的特定内容。也是一套独立的、自成体系的知识点。在很多语言中,都有对正则的使用。正则表达式是用来做字符串的校验、匹配的工作的,其实正则表达式只有一个作用:验证一个字符串是否与指定的规则匹配。无论是数据清洗、表单验证,还是日志分析、爬虫开发,正则表达式都能大幅提升文本处理效率,是程序员、数据分析师等技术岗位的必备技能。

在很多的语言中,都在匹配的基础上,添加了其他的功能。本文拿python来进行举例。

例如:在验证QQ号码是否合规,这个需求可以使用if语句进行直接判断也可以使用正则,正则只是实现这个需求中的一小部分内容

"""
需求:验证一个字符串,是否是一个合法的QQ号码
    1、一个QQ号码由6到12位的数字组成,不能包含其他部分
    2、一个QQ号码不能以数字0作为开头
"""


def check_qq_number(number):
    s = str(number)
    # 验证长度
    if not 6 <= len(s) <= 12:
        return False
    # 验证纯数字
    if not s.isdigit():
        return False
    # 验证不以0开头
    if s.startswith('0'):
        return False
    return True


def check_qq_number_with_re(number):
    return re.compile('[1-9]\\d{5,11}').fullmatch(number) is not None


print(check_qq_number_with_re('012345678'))
常用元字符

元字符

意义

^

匹配一个字符串的开头。 在fullmatch的正则匹配中,可以省略不写。

$

匹配一个字符串的结尾。 在fullmatch的正则匹配中,可以省略不写。

[]

匹配一位字符。[abc]: 表示这一位的字符, 可以是a、也可以是b、也可以是c 。[a-z]: 表示这一位的字符, 可以是 [a, z] 范围内的任意的字符。[a-zABC]: 表示这一位的字符, 可以是 [a,z ] 范围内的任意字符, 或者A、或者B、或者C 。[a-zA-Z]: 表示这一位的字符, 可以是任意的字母, 包括大写字母和小写字母。[^abc]: 表示这一位的字符, 可以是除了 a、b、c 之外的任意字符。

\

转义字符。

\d

匹配所有的数字, 等同于 [0-9] 。

\D

匹配所有的非数字, 等同于 [^0-9] 。

\w

匹配所有的单词字符, 等同于 [a-zA-Z0-9_] 。

\W

匹配所有的非单词字符, 等同于 [^a-zA-Z0-9_] 。

.

通配符, 可以匹配一个任意的字符。

+

前面的一位或者一组字符, 连续出现了一次或多次。{1,}

?

前面的一位或者一组字符, 连续出现了一次或零次。

*

前面的一位或者一组字符, 连续出现了零次、一次或多次。

{}

对前面的一位或者一组字符出现次数的精准匹配。{m} : 表示前面的一位或者一组字符连续出现了m次。{m,} : 表示前面的一位或者一组字符连续出现了至少m次。{m,n} : 表示前面的一位或者一组字符连续出现了至少m次,最多n次。

|

作用于整体或者是一个分组, 表示匹配的内容, 可以是任意的一个部分。abc|123|opq : 表示整体的部分, 可以是 abc, 也可以是 123, 也可以是 opq

()

分组。 把某些连续的字符视为一个整体对待。

Python的正则基本处理

Python中的正则表达式基本使用

pattern_obj = re.compile(正则语法规则, 匹配的标记格式)

涉及到的几个类

re.Pattern: 正则表达式对象,用来描述正则表达式

re.Match: 匹配结果对象,用来描述正则匹配的结果,包含匹配的位置和匹配的内容 .

group(): 获取到匹配的内容 .

group(N): 获取匹配到的第N组的内容 .

group(group_name): 获取匹配到的指定组名的内容 .

span(): 获取到匹配的位置

常用方法

pattern_obj.match('字符串')      从前往后查找匹配项,找到了就返回匹配的部分(Match对象),找不到返回None
pattern_obj.fullmatch('字符串')  用指定的正则语法规则,匹配整个的字符串,能够匹配就返回匹配部分(Match对象),匹配不到就返回None
pattern_obj.search('字符串')     在指定的字符串中查找满足规则的子串,返回第一个匹配部分(Match对象),找不到就返回None
pattern_obj.findall('字符串')    在指定的字符串中查找所有满足规则的子串,返回一个列表
pattern_obj.finditer('字符串')   在指定的字符串中查找所有的匹配项,返回迭代器(迭代Match对象)
pattern_obj.split('字符串')      将一个字符串使用指定的正则切割
pattern_obj.sub(替换函数,字符串,替换数量)        将匹配到的每一个部分,使用指定函数处理,并替换掉原有的内容

re包简化

在re包的__init__.py文件中定义了若干个函数,用来简化上述方法的使用。

re.match('正则表达式', '字符串')
re.match('正则表达式', '字符串')      
re.fullmatch('正则表达式', '字符串')  
re.search('正则表达式', '字符串')     
re.findall('正则表达式', '字符串')    
re.finditer('正则表达式', '字符串')   
re.split('正则表达式', '字符串')      
re.sub('正则表达式', '替换函数','字符串','替换数量')

匹配标记格式 re.I 忽略大小写的匹配 re.M 多行匹配,会影响到^和$ re.S 使.可以匹配包括换行符在内的所有字符

(?P<name>) ?P=name,给分组正则起名的方式。

表达式:

result=re.match(r"<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(? P=name1)>$", msg)

print(result)

print(result.group(1))

print(result.group(2))

print(result.group(3))

对应说明:

“(?P<name1>\w+)”:首先使用固定格式(?P<name>),其中name为自定义的名字,此处起的名字为”name1”,后面直接写入分组内容“\w”。

“(?P=name1)”:在后面引用分组内容时只需写(?P=name)即可,此处引用”name1”组的内容。

</(?P=name2)></(?P=name1)>使用命名引用,匹配与name2name1相同的标签

示例:对网页html代码进行解析匹配

s = '<div><p>hello</p></div>'
result=re.fullmatch(r"^<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>$",s)
print(result is not None) #True

print("D:\\a\\b\c.txt")
# r放在一个字符串的前面,表示这个字符串中的\无需再转义了
print(r"D:\a\b\c.txt")

对邮箱进行解析匹配 

#  先拿到这个对象Pattern   通过这个对象获取Match 对象
res2 = re.fullmatch('(\\w{6,16})@(?P<company_name>126|163|qq|gmail|yahoo)\\.com', 'test_youxiang@163.com')
if res2 is not None:
    # 什么是分组,其实就是正则中的() 一个括号是一个组
    print(res2.groups())
    print(res2.group(2)) # 0 代表全部, 1 代表第一个分组的内容
    print(res2.group("company_name")) # 163

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值