Python正则表达式

2024-01-15 12:33:39 浏览数 (2)

本文写作思路和建议: 1、本文主要阐述了Python正则表达式的概念、常用操作、使用方法,方便快速了解正则表达式的应用; 2、学习之前建议对字符串进行深入的了解,比如字符串的常用操作等,因为正则表达式一般主要操作对象就是对于字符串的处理; 3、为了方便查看结果,文章开始就使用了python的re模块中match()方法,在文中后边会详细说明这个方法的使用技巧,前边使用只是为了输出我们需要的结果信息。

1 正则表达式的定义

  • 正则表达式一般操作对象为字符串;
  • 通常的可以理解为正则表达式为记录文本规则的代码或工具;
  • 应用场景为比如查找符合某些复杂规则的字符串。

以下是关于正则的一些基本使用和操作。

2 行定位符

  • 行定位符用来描述子串的边界;
  • 主要使用“ ^ ”表示行开始,使用" $ "为行结尾;
  • 比如针对以下字符串的造作,我们匹配行开始(注意这里的re模块的使用后续会详细说明,这里先用一下):
代码语言:python代码运行次数:0复制
import re

str_01 = "python is my favourite programing language!"
str_02 = "who is my favourite programing language of python! "
pat = r"^python"
str_result_01 = re.match(pat, str_01, re.I)
str_result_02 = re.match(pat, str_02, re.I)

print(str_result_01.string)  # 输出为:python is my favourite programing language!
print(str_result_02)  # 没有匹配到,输出为:None

3 元字符

  • 除了前边的“^”和"$"外,正则表达式还有很多元字符;
  • 比如格式:bqww*b;
  • 上边的这个格式应该如何理解呢:

① 这个格式表示用于匹配以字母qw开头的单词; ② 先从某个单词开始处(b),然后匹配字母qw,接着是任意的字母或字符(w*),最后是单词结束处(b);

  • 针对上边这个格式,我们简单看一个示例,我们的匹配需求如下:

如匹配格式: bqww*b,那么下边的都可以匹配qw123213和qwerererer; 不能匹配123qw和werqw。

  • 代码如下:
代码语言:python代码运行次数:0复制
import re

pat_01 = r"bqww*b"
str_list = ["qw123213", "qwerererer", "123qw", "werqw"]
for i in range(4):
    str_result = re.match(pat_01, str_list[i], re.I)
    print(str_result)

# 输出为:
# <re.Match object; span=(0, 8), match='qw123213'>
# <re.Match object; span=(0, 10), match='qwerererer'>
# None
# None
  • 以下是常用的元字符:

代码

说明

.

匹配除换行符以外的任意字符

w

匹配字母、数字、下划线或汉字

W

匹配除字母、数字、下划线或汉字以外的字符

s

匹配单个空白符(包括tab键和换行符)

S

匹配除单个空白符(包括tab键和换行符)以外的所有字符

d

匹配数字

b

匹配单词的开始或结束,单词的分界符通常是空格、标点符号或者换行

^

匹配字符串的开始

$

匹配字符串的结尾

4 限定符

  • 限定符就是指定数量的字符;
  • 之前提到的可以匹配任意字符的元字符,那如果要匹配特定数量的数字,就要使用限定符了;
  • 以下是常用限定符:

限定符

说明

?

匹配前边的字符零次或一次

匹配前边的字符一次或多次

*

匹配前边的字符零次或多次

{n}

匹配前边的字符n次

{n,}

匹配前边的字符最少n次

{n,m}

匹配前边的字符最少n次,最多m次

  • 关于限定符我们来看以下示例:

我们的需求是列表中有几组字符串,遍历列表后,把是6位数字的进行匹配,打印看结果是否能匹配到。

  • 详细代买如下:
代码语言:python代码运行次数:0复制
import re

pat_02 = r"^d{6}$"

str_list = ["123456", "12345678", "123456789", "345678"]
for i in range(4):
    str_result = re.match(pat_02, str_list[i], re.I)
    print(str_result)

# 输出为:
# <re.Match object; span=(0, 6), match='123456'>
# None
# None
# <re.Match object; span=(0, 6), match='345678'>

5 字符类

正则表达式可以匹配数字和字母,因为这些有对应的元字符;

但是如果没有元字符的字符如何匹配呢?

以下是列举了一些没有元字符的字符匹配方式,方法就是直接在方括号中括起来即可:

【aeiou】,匹配任何一个英文元音字母 【.?!】,匹配标点符号(" . " 或" ? "或" ! ") 【0-9】,和"d"一样,0-9任意一个数字 【a-z0-9A-Z】,等同于"w"

  • 关于上边提到的我们看个示例:
代码语言:python代码运行次数:0复制
import re

pat_03 = r"[a]"
str_list = ["aeiou1233", "23aeiou34", "a2e3i44o56u"]
for i in range(3):
    str_result = re.match(pat_03, str_list[i], re.I)
    print(str_result)

# 输出为:
# <re.Match object; span=(0, 1), match='a'>
# None
# <re.Match object; span=(0, 1), match='a'>

6 排除字符

  • " ^ "表示行的开始,如果放在方括号中表示排除;
  • 如【^a-zA-Z】表示匹配一个不是字母的字符(请注意这里的方括号是英文的法,因为打不出来,所以用中文代替);
  • 示例如下:
代码语言:python代码运行次数:0复制
import re

pat_04 = r"[^a-zA-Z]"
str_list = ["abcdfg234324", "12354454", "a2e3i44o56u"]
for i in range(3):
    str_result = re.match(pat_04, str_list[i], re.I)
    print(str_result)

# 输出为:
# None
# <re.Match object; span=(0, 1), match='1'>
# None

7 选择字符

  • 使用" | "来表示,意思为"或"
  • 比如我们用这个符号来匹配手机号(11位)或座机号(11位);
代码语言:python代码运行次数:0复制
import re

pat_05 = r"(^d{11}$)|(^d{8}$)"
str_list = ["13312344321", "02912341234", "1879245"]
for i in range(3):
    str_result = re.match(pat_05, str_list[i], re.I)
    print(str_result)

# 输出为:
# <re.Match object; span=(0, 11), match='13312344321'>
# <re.Match object; span=(0, 11), match='02912341234'>
# None

8 转义字符

  • 转移字符就是将特殊字符变成普通字符;
  • 转移字符使用()表示;
  • 比如我们匹配ip地址:
代码语言:python代码运行次数:0复制
import re

pat_06 = r"[0-9]{1,3}.[0-9]{1,2}.[0-9]{1,3}.[0-9]{1,3}"
str_list = ["127.0.0.1", "172.1.1.1", "192.168.2.1"]
for i in range(3):
    str_result = re.match(pat_06, str_list[i], re.I)
    print(str_result)
    
# 输出为:
# <re.Match object; span=(0, 9), match='127.0.0.1'>
# <re.Match object; span=(0, 9), match='172.1.1.1'>
# None

9 分组

  • 分组我们可以使用小括号;
  • 比如:

(ma|pa)th,匹配math和path

10 re模块实现正则表达式详解

  • 使用以下引入re模块即可:

import re

10.1 匹配字符串

10.1.1 match()方法

  • 从字符串的开始处进行匹配,匹配成功返回Match对象,失败返回None;
  • 语法:

re.match(pattern,s,flags)

  • 说明:

pattern:模式字符串 s:要匹配的字符串 flags:可选,控制匹配方式

  • 一个示例:
代码语言:python代码运行次数:0复制
# -*- coding:utf-8 -*-

import re

pattern = r"httpw "
s = "HTTPS://cloud.tencent.com/developer/user/10298071"
s1 = "博客地址HTTPS://cloud.tencent.com/developer/user/10298071"
mymatch = re.match(pattern, s, re.I)
mymatch1 = re.match(pattern, s1, re.I)
print(mymatch)
print(mymatch1)

# 输出为:
# HTTPS://cloud.tencent.com/developer/user/10298071
# None
  • 关于flags常用标志

标志

说明

A或ASCII

只进行ASCII 匹配

I或IGNORECASE

匹配不区分大小写

M或MULTILINE

将^和$用于包括整个字符串的开始和结尾的每一行

S或DOTALL

使用(.)字符匹配所有字符

X或VERBOSE

忽略模式字符串中未转义的空格和注释

10.1.2 search()方法

  • 用于在整个字符串中搜索第一个匹配的值,成功返回对象,失败返回None;
  • 语法:

re.search(pattern,s,flags)

  • 说明:

pattern:模式字符串 s:要匹配的字符串 flags:可选,控制匹配方式

  • 一个示例:
代码语言:Python复制
import re

pattern = r"httpw "
s = "HTTPS://cloud.tencent.com/developer/user/10298071"
s1 = "博客地址HTTPS://cloud.tencent.com/developer/user/10298071"
mymatch = re.search(pattern, s, re.I)
mymatch1 = re.search(pattern, s1, re.I)
print(mymatch)
print(mymatch1)

# 输出为:
# <re.Match object; span=(0, 5), match='HTTPS'>
# <re.Match object; span=(4, 9), match='HTTPS'>

10.1.3 findall()方法

  • 用于在整个字符串中搜索所有符合正则表达式的字符串,成功返回包含匹配结构的列表,失败返回空列表;
  • 语法:

re.findall(pattern,s,flags)

  • 说明:

pattern:模式字符串 s:要匹配的字符串 flags:可选,控制匹配方式

  • 一个示例:
代码语言:python代码运行次数:0复制
# -*- coding:utf-8 -*-

import re

pattern = r"httpw "
s = "HTTPS://cloud.tencent.com/developer/user/10298071"
s1 = "博客地址HTTPS://cloud.tencent.com/developer/user/10298071"
mymatch = re.findall(pattern, s, re.I)
mymatch1 = re.findall(pattern, s1, re.I)
print(mymatch)
print(mymatch1)

# 输出为:
# ['HTTPS']
# ['HTTPS']

10.2 替换字符串

  • sub()方法用于字符串替换;
  • 语法:

re.sub(patern, repl, s, count, flags)

  • 说明:

patern:模式字符串 repl:替换的字符串 s:原始字符串 count:可选,替换的最大次数,默认为0 flags:控制匹配方式

代码语言:python代码运行次数:0复制
import re

pattern = r"8[345]d{6}"
s = "文章中编号为:83578910"
result = re.sub(pattern, "98765432", s)
print(result) # 输出为:文章中编号为:98765432

10.3 正则表达式分割字符串

  • 语法:

re.spilt(pattern, s, maxsplit, flags)

  • 说明:

pattern:模式字符串 s:要匹配的字符串 maxsplit:可选,最大的拆分次数 flags:可选,控制匹配方式

代码语言:python代码运行次数:0复制
import re

pattern = r"[?|&]"
s = "http://www.wertyy.com/login.jsp?username='admin'&password='123456'"

result = re.split(pattern, s)
print("原字符串:", s) 
print("分割后的字符串:", result)

# 输出为:
# 原字符串: http://www.wertyy.com/login.jsp?username='admin'&password='123456'
# 分割后的字符串: ['http://www.wertyy.com/login.jsp', "username='admin'", "password='123456'"]

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞