前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python正则表达式

Python正则表达式

原创
作者头像
虫无涯
修改2024-01-15 12:33:39
26620
代码可运行
修改2024-01-15 12:33:39
举报
文章被收录于专栏:全栈测试技术全栈测试技术
运行总次数:0
代码可运行

本文写作思路和建议: 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 元字符

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

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

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

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

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

pat_01 = r"\bqw\w*\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"http\w+"
s = "/developer/user/10298071"
s1 = "博客地址/developer/user/10298071"
mymatch = re.match(pattern, s, re.I)
mymatch1 = re.match(pattern, s1, re.I)
print(mymatch)
print(mymatch1)

# 输出为:
# /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"http\w+"
s = "/developer/user/10298071"
s1 = "博客地址/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"http\w+"
s = "/developer/user/10298071"
s1 = "博客地址/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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 正则表达式的定义
  • 2 行定位符
  • 3 元字符
  • 4 限定符
  • 5 字符类
  • 6 排除字符
  • 7 选择字符
  • 8 转义字符
  • 9 分组
  • 10 re模块实现正则表达式详解
    • 10.1 匹配字符串
      • 10.1.1 match()方法
      • 10.1.2 search()方法
      • 10.1.3 findall()方法
    • 10.2 替换字符串
      • 10.3 正则表达式分割字符串
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com