Python正则表达式

一、什么是正则表达式

正则表达式又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

python对于正则表达式的支持还是比较方便的,使用前导入re包就可以了。

二、正则表达式语法

2.1 [] 表示一个字符,该字符是[]中指定的内容

[a-z] 该字符是任意小写字母
[A-Z] 该字符是任意大写字母
[a-zA-Z0-9] 该字符任意字母或者数字

2.2 预定义字符(注意大小写)

. :表示匹配任意1个字符(除了\n) \.匹配点本身
\d :表示匹配数字,等同于[0-9]
\w :表示单词字符,等同于[a-zA-Z0-9_]
\s :表示空格或者tab
\D :表示匹配非数字
\W :表示匹配非单词字符
\S :表示匹配非空格

2.3 数量匹配

*:表示匹配前一个规则字符出现0-无数次
+:表示匹配前一个规则字符至少出现1次-无数次
?:表示匹配前一个规则字符出现0或者1次
{m}:表示匹配前一个规则字符出现m次
{m,}:表示匹配前一个规则字符至少出现m次
{m,n}:表示匹配前一个规则字符出现m-n次

2.4 边界匹配

^:表示匹配字符串开头
$:表示匹配字符串结尾
\b:表示匹配一个单词边界
\B:表示匹配非单词边界

2.4 分组匹配

|:匹配左右任意一个表达式
():将括号中的字符作为一个分组

三、代码示例

3.1 基础匹配

"""
这里是正则表达式的代码示例,需要导re包
正则表达式re模块的基本匹配方法
"""


import re

# 1. match  从头匹配第一个命中项


str1 = "python is a good language python1!"
# str11 = "1 python is a good language python1!"

res = re.match("python", str1)
print(type(res))
print(res)
# 如果是str11,因为从头开始就不匹配,所以返回None
print(res.span())  # 获取匹配的开始下标到结束下标,不包含右边界
print(res.group()) # 获取匹配的结果

# 运行结果:
# 
# 

print("===================== 分割线1 ==================== ")
res = re.match("python1", str1)
print(type(res))
print(res)   # None,因为match是从头开始匹配,即使字符串中有python1,也不能匹配
print("===================== 分割线2 ==================== ")


# 2. serach  全局匹配,匹配第一个命中项
str2 = "dwadwa python is a good language python1 python !"
res2 = re.search("python", str2)
print(type(res2))
print(res2)
print(res2.span())  # 返回第一个匹配到的其实下标和右边界
print(res2.group()) # 获取匹配的结果
print("===================== 分割线3 ==================== ")


# 3. findall  全局匹配,匹配所有满足项
str3 = "dwadwa python is a good language python1 python dwadadpythonwad python!"

res3 = re.findall("python", str3)
print(res3)

3.2 元字符匹配

"""
Python 正则表达式 元字符匹配代码示例
"""

import  re

str1 = "dwada @@ 163 qq #?!!! 789"

# 字符串前面带r 表示转义字符无效
# 找所有在a-z F-Z 0-9的字符
res1 = re.findall(r'[a-zF-Z0-9]', str1)
print(res1)

# 只找0-9的数字
res1 = re.findall(r'[0-9]', str1)
print(res1)
print("===================== 分割线1 ==================== ")

# 2,匹配账号,只能由数字和字母组成,长度限制6-10位
str2 = "hdjskahdkjshakdhas"
res2 = re.findall(r'^[0-9a-zA-Z]{6,10}$', str2)
print(res2)

str2 = "hdj121ska"
res2 = re.findall(r'^[0-9a-zA-Z]{6,10}$', str2)
print(res2)
print("===================== 分割线2 ==================== ")

# 2,匹配qq号, 只能由数字组成,长度在5-11,第一位不能是0
# 说明:第一位限制在1-9,剩下的4-10位限制在0-9 {4,10}限定剩余的长度
rule = '^[1-9][0-9]{4,10}$'
str3 = "01255306110"

res3 = re.findall(rule, str3)
print(res3)
print("===================== 分割线3 ==================== ")

# 3.匹配邮箱,只允许 qq 163 gmail 三种邮箱地址
# [email protected]
# 邮箱的格式: [email protected]
# 说明:[\w-]+ 表示所有的数字 a-z A-Z _ -的集合  +号表示至少出现一次
#      (\.[\w-]+)* 表示.xxx  *表示可以出现0到无数次
#      (qq|163|gmail)  三者选一
#      (\.[\w-]+)+  表示该.xxx 至少出现一次
rule4 = '[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+'
str4 = "[email protected]"
str5 = "[email protected]"
res4 = re.findall(rule4, str4)
print(res4)
res4 = re.findall(rule4, str5)
print(res4)

rule41 = r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)'
str4 = "[email protected]"
str5 = "[email protected]"
res4 = re.findall(rule41, str4)
print(res4)
res4 = re.findall(rule41, str5)
print(res4)

你可能感兴趣的:(linux,python,正则表达式)