Python 正则表达式使用详解

本文详细介绍了如何在Python中使用正则表达式进行字符串匹配,包括单个字符、多个字符、开头结尾、分组以及特殊字符转义的应用。通过实例演示了如何验证变量名、邮箱地址和HTML标签结构。
摘要由CSDN通过智能技术生成

目录

1、匹配单个字符

2、匹配多个字符

3、匹配开头结尾

4、匹配分组

说明:在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用re模块

表达式:re.match(正则表达式, 要匹配的字符串) 有返回值说明匹配成功;否则匹配失败。

特别注意:正则表达式的前面必须添加 r 进行标记正则表达式;因为re中字符串需要是正则式,因此其本身不能被python当作特殊字符处理,故用r使得re接收到完整的正则式字符串。

 示列:

import re

result = re.match(r"hello", "hello world")
print(result)

result1 = re.match(r"[hH]ello", "hello world")
print(result1)

result2 = re.match(r"HHHello", "hello world")
print(result2)

1、匹配单个字符

以下匹配均只匹配单个字符

字符

功能

.

匹配任意1个字符(除了\n) re.match()添加re.S参数后可以匹配\n

[]

匹配[]中列举的字符

\d

匹配数字,即0~9

\D

匹配非数字,即不是数字

\s

匹配空白,即空格,tab键

\S

匹配非空白

\w

匹配单词字符,即a-z、A-Z、0-9、_

\W

匹配非单词字符

- :表示连续的内容 0-9 a-z A-Z

group() : 获取匹配成功后的内容

# 匹配单个字符
import re

res1 = re.match(r"这是re模块\d", "这是re模块1")
print(res1.group()) # 这是re模块1

res2 = re.match(r"这是re模块\d", "这是re模块9")
print(res2.group()) # 这是re模块9

res3 = re.match(r"这是re模块[1-367]", "这是re模块3")
print(res3.group()) # 这是re模块3

res4 = re.match(r"这是re模块[1-367]", "这是re模块7")
print(res4.group()) # 这是re模块7

res5 = re.match(r"这是re模块[1-3a-cA-D]", "这是re模块D")
print(res5.group()) # 这是re模块D

res6 = re.match(r"这是re模块\s", "这是re模块 D")
print(res6.group()) # 这是re模块

res7 = re.match(r"这是re模块\w", "这是re模块_")
print(res7.group()) # 这是re模块_

2、匹配多个字符

字符

功能

*

匹配前一个字符出现0次或者无限次,即可有可无

+

匹配前一个字符出现1次或者无限次,即至少1次

匹配前一个字符出现1次或者0次,即要么有1次,要么没有(非贪婪匹配)

{m}

匹配前一个字符出现m次

{m,n}

匹配前一个字符出现从m~n次

示例:

import re

# 匹配多个字符
# {m,n} 匹配前一个字符出现从m~n次
res1 = re.match(r"这是re模块\d{1,3}", "这是re模块1")
print(res1.group()) # 这是re模块1

res2 = re.match(r"这是re模块\d{1,3}", "这是re模块123")
print(res2.group()) # 这是re模块123

# {m} 匹配前一个字符出现m次
# \d{11} 数字必须连续出现11次
res1 = re.match(r"\d{11}", "12345678901")
print(res1.group()) # 12345678901

res2 = re.match(r"\d{11}", "12345A678901")
print(res2.group()) # AttributeError: 'NoneType' object has no attribute 'group'

# ?匹配前一个字符出现1次或者0次,即要么有1次,要么没有
# 判断电话取号是否合法
res1 = re.match(r"021-\d{8}", "021-12345678")
print(res1.group()) # 021-12345678

res2 = re.match(r"021-?\d{8}", "02112345678")
print(res2.group()) # 02112345678

res3 = re.match(r"021-?\d{8}", "021-12345678")
print(res3.group()) # 021-12345678

res4 = re.match(r"\d{3,4}-?\d{8}", "0210-12345678")
print(res4.group()) # 0210-12345678

# * 匹配前一个字符出现0次或者无限次,即可有可无
# . 匹配任意1个字符(除了\n)
# 如果一个字符串内容很长并且有很多换行 使用三引号"""或'''
txt_content = '''adshgad
564898
sachoiaus
sachsayogca
asjyha
sajp78adas
958dnouahd8
++0
.
'''
res1 = re.match(r".*", txt_content)
print(res1.group()) # adshgad \n(换行)无法匹配

res2 = re.match(r".*", txt_content, re.S)
print(res2.group()) #添加re.S参数后 匹配html_content里面的所有内容

# + 匹配前一个字符出现1次或者无限次,即至少1次
# . 匹配任意1个字符(除了\n)
res1 = re.match(r".+", "025sdcha")
print(res1.group()) # 025sdcha

res2 = re.match(r".+", "")
print(res2.group()) # AttributeError: 'NoneType' object has no attribute 'group'

3、匹配开头结尾

字符

功能

^

匹配开头字符串

$

匹配字符串结尾

示例1:匹配出,变量名是否有效

import re

def main():
    names = ["name1", '_name', '02nmae', '__name__', 'name!', 'name@#']
    for name in names:
        res = re.match(r"[a-zA-Z_][a-zA-Z0-9_]*", name)
        if res:
            print("有效的变量名有: {}; 通过正则表达式匹配出来的数据是: {}".format(name, res.group()))
        else:
            print("无效的变量名有: ", name)

if __name__ == '__main__':
    main()

问题:可以看出变量:name!、name@#是不合法的但是match()函数还是有返回值,原因是match()函数自带从开头开始匹配但是不判断结尾。要想match()函数判断结尾需要使用字符:$

示例1:优化

  • 注意:此例的判断开头符 ^ 可以省略
import re

def main():
    names = ["name1", '_name', '02nmae', '__name__', 'name!', 'name@#']
    for name in names:
        res = re.match(r"^[a-zA-Z_][a-zA-Z0-9_]*$", name)
        if res:
            print("有效的变量名有: {}; 通过正则表达式匹配出来的数据是: {}".format(name, res.group()))
        else:
            print("无效的变量名有: ", name)

if __name__ == '__main__':
    main()

字符转义问题

  • 1、如果在正则表达式中需要用到某些普通的字符,比如 . ? 等只需要在该字符的前面添加一个反斜杠\进行转义

  • 2、使用了[]符代表只匹配一个字符

示例如下:匹配出qq的邮箱地址,且@符号之前有4到20位,例如:123@qq.com

import re

def main():
    addrs = ["01552ahsgfhuag@qq.com", "5502@qq.com", "dss15@qq.com", "15sajhaj", "15613@qq.cn"]
    for addr in addrs:
        # 如果在正则表达式中需要用到某些普通的字符,比如 . ? 等只需要在该字符的前面添加一个反斜杠\进行转义,
        # 即出现需要匹配的字符和正则表达式的字符重合了,那么使用反斜杠\对需要匹配的字符进行转义。
        res = re.match(r"^[0-9a-zA-Z]{4,20}@qq\.com$", addr)
        if res:
            print("合法的邮箱有: ", addr)
        else:
            print("不合法的邮箱有: ", addr)

if __name__ == '__main__':
    main()

4、匹配分组

字符

功能

|

匹配左右任意一个表达式

(ab)

将括号中的字符作为一个分组

\num

引用分组num匹配到的字符串

(?P)

分组起别名(注意要加上括号)

(?P=name)

引用别名为name分组匹配到的字符串

示列:

import re

res1 = re.match(r"[a-zA-Z0-9_]{4,20}@qq\.com", "hello@qq.com").group()
print(res1) # hello@qq.com

# | 匹配左右任意一个表达式
res2 = re.match(r"[a-zA-Z0-9_]{4,20}|@qq\.com", "@qq.com").group()
print(res2) # @qq.com

# (ab) 将括号中的字符作为一个分组
res3 = re.match(r"[a-zA-Z0-9_]{4,20}@(sohu|qq)\.com", "hello@qq.com").group()
print(res3) # hello@qq.com

# 取得匹配成功之后分组里面的数据 在group里面取得
res4 = re.match(r"[a-zA-Z0-9_]{4,20}@(sohu|qq)\.com", "hello@qq.com").group(1)
print(res4) # qq

res5 = re.match(r"([a-zA-Z0-9_]{4,20})@(sohu|qq)\.com", "hello@qq.com").group(1)
print(res5) # hello  当group(2)时取得结果为:qq

#  \num引用分组num匹配到的字符串 要求匹配标签是否为1组即<h1></h1>为1组
html_str = "<h1>hello world</h1>"
res6 = re.match(r"<\w*>.*</\w*>", html_str).group()
print(res6) # <h1>hello world</h1>

html_str2 = "<h1>hello world</h2>"
res6 = re.match(r"<\w*>.*</\w*>", html_str2).group()
print(res6) # <h1>hello world</h2> 此处本不应该匹配成功的,但是还是匹配成功了所以需要修改为第一个标签和最后一个标签要一样

# 修改如下:
res7 = re.match(r"<(\w*)>.*</\1>", html_str2).group()
print(res7) # AttributeError: 'NoneType' object has no attribute 'group'

res8 = re.match(r"<(\w*)>.*</\1>", html_str).group()
print(res8) # <h1>hello world</h1>

html_str3 = "<body><h1>hello world</h1></body>"
res9 = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", html_str3).group()
print(res9) # <body><h1>hello world</h1></body>

# (?P<name>)分组起别名 (?P=name)引用别名为name分组匹配到的字符串
res10 = re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>", html_str3).group()
print(res10) # <body><h1>hello world</h1></body>
  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以回答你关于Python正则表达式的问题。 Python正则表达式是一种用来匹配和处理字符串的工具。它可以在字符串中搜索和匹配特定的模式,以实现更高效和精确的数据处理。Python的re模块提供了完整的正则表达式支持,并且非常强大和灵活。 使用Python正则表达式,你可以实现各种字符串操作,比如搜索、替换、分割、提取等等。它的语法相对简单,但是功能非常强大,可以满足大部分的字符串处理需求。 在使用Python正则表达式时,你需要掌握一些基本的语法规则,比如元字符、字符集、重复、分组等等。这些语法规则可以组合在一起,形成复杂的匹配模式,以实现更加精细的字符串处理。 总之,Python正则表达式是一种非常有用的工具,可以大大提高字符串处理的效率和精确度。如果你想深入了解它的用法和技巧,可以查看Python官方文档中关于re模块的详细说明。 ### 回答2: Python正则表达式是一种强大的文本匹配和处理工具,通过使用特定的模式来识别和操作文本中的字符串正则表达式通常被用于从文本中提取特定的信息、验证输入的有效性、进行替换或搜索等操作。 Python正则表达式的语法使用元字符和特殊字符来定义搜索模式,其中元字符用于描述字符类型或位置,特殊字符用于描述重复次数或匹配方式。常见的元字符包括"."(匹配任意字符)、"\d"(匹配数字字符)、"\w"(匹配字母、数字或下划线字符)、"\s"(匹配空白字符)等。特殊字符包括"*"(匹配前面的模式0次或多次)、"+"(匹配前面的模式1次或多次)、"?"(匹配前面的模式0次或1次),以及花括号{}(指定前面模式的重复次数)等。 使用Python正则表达式时,常见的操作包括匹配、搜索、替换和分割。匹配操作通过`re.match()`或`re.search()`函数实现,用于从字符串的起始位置或任意位置开始匹配;搜索操作通过`re.findall()`或`re.finditer()`函数实现,用于在整个字符串中搜索匹配的内容;替换操作通过`re.sub()`函数实现,用于替换匹配到的内容;分割操作通过`re.split()`函数实现,用于按指定的模式分割字符串Python正则表达式还支持分组、捕获、非捕获、反向引用等高级特性,可通过使用括号`()`进行分组,并使用`\number`的方式引用分组匹配到的内容。 总而言之,Python正则表达式提供了一套强大且灵活的工具来处理文本匹配和处理的需求。学习和熟练掌握正则表达式使用,对于处理和分析文本数据将大有裨益。 ### 回答3: Python正则表达式是一种用来匹配字符串模式的工具。它使用一种特殊的语法来描述字符串的模式,然后通过与给定的字符串进行比较,判断是否匹配。 在Python中,我们使用re模块来使用正则表达式。首先,我们需要导入re模块,然后使用re模块提供的函数来进行匹配操作。 正则表达式中的一些基本概念包括: 1. 字符组:用方括号[]表示,表示匹配其中的任意一个字符。例如[abc]表示匹配字符a、b或c。 2. 量词:用来表示匹配多个字符的数量。例如*表示匹配0个或多个字符,+表示匹配1个或多个字符,?表示匹配0个或1个字符。 3. 元字符:具有特殊含义的字符,例如.表示匹配除换行符外的任意字符,\d表示匹配任意一个数字字符。 4. 转义字符:使用反斜杠\来转义元字符。例如\.表示匹配点字符。 5. 边界匹配:^表示匹配字符串的开头,$表示匹配字符串的结尾。 可以通过这些基本概念进行复杂模式的匹配。例如,使用re模块的match函数可以判断一个字符串是否以某个模式开头,使用search函数可以在字符串中搜索匹配某个模式的子串,使用findall函数可以找到所有匹配的子串。 除了基本概念外,Python正则表达式还提供了一些更高级的功能,例如分组、捕获和替换等。 总之,Python正则表达式是一种强大的工具,可以用于字符串匹配和处理。掌握正则表达式的基本语法和常用函数,可以帮助我们更高效地处理字符串操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值