re正则表达式的基础内容

时间:2024-03-09 20:56:14

 什么是re正则表达式?

正则表达式(Regular Expression,简称为 RegExp 或者 RE)是一种用于匹配字符串的强大工具。它是由普通字符(例如字母、数字)和元字符(特殊字符)组成的字符串,用于描述字符串的特征模式。

正则表达式可以用来进行文本搜索和文本替换,以及数据验证等任务。它在计算机科学领域有着广泛的应用,如文本处理、网络爬虫、数据提取、数据清洗等。

在 Python 中,正则表达式模块是 re 模块,通过该模块可以使用各种函数来操作正则表达式,比如搜索、匹配、替换等。

正则表达式由两部分组成:

  1. 普通字符:表示字符串中的字符,如字母、数字等。
  2. 元字符:具有特殊含义的字符,用于描述字符串的模式,如通配符、量词等。

例如,^ 表示字符串的开始,$ 表示字符串的结束,. 表示任意单个字符,* 表示前一个字符重复零次或多次,\d 表示数字等。

通过组合普通字符和元字符,可以构建出复杂的模式,用来匹配符合特定条件的字符串。


如何在python中使用re正则表达式 ?

正则表达式是python中自带的库,不需要进行下载,可以直接导入使用,import re


re中基础匹配字符或字符串的语句

匹配单个字符

import re

# 匹配字符串开头是否为 'h',如果是则匹配成功
text001 = "hello"
a = re.match('h', text001)
print(a.group())  # 输出: h

# 匹配任意一个字符
text002 = "hello"
a = re.match('.', text002)
print(a.group())  # 输出: h

# 匹配一个数字字符
text003 = "11111"
a = re.match(r'\d', text003)
print(a.group())  # 输出: 1

# 匹配一个非数字字符
text004 = "+hello"
a = re.match(r'\D', text004)
print(a.group())  # 输出: +

# 匹配一个空白字符
text005 = " hello"
a = re.match(r'\s', text005)
print(a.group())  # 输出: (空格)

# 匹配一个字母、数字或下划线
text006 = "_hello"
a = re.match(r'\w', text006)
print(a.group())  # 输出: _

# 匹配一个非字母、数字或下划线字符
text007 = "+hello"
a = re.match(r'\W', text007)
print(a.group())  # 输出: +

re.match(pattern, string, flags=0):从字符串的起始位置开始匹配正则表达式

匹配多个字符

import re

# 匹配数字或减号的一个或多个实例
text008 = "0731-888888"
a = re.match(r'[\d\-]+', text008)
print(a.group())  # 输出: 0731-888888

# 匹配数字的一个或多个实例
text009 = "0731-888888"
a = re.match(r'[0-9]+', text009)
print(a.group())  # 输出: 0731

# 匹配小写字母、大写字母或数字的一个或多个实例
text010 = "ask23dl46EFWF78a547W"
a = re.match(r'[a-z,A-Z,0-9]+', text010)
print(a.group())  # 输出: ask23dl46EFWF78a547W

# 匹配数字的零个或多个实例
text011 = "0731-888888"
a = re.match(r'\d*', text011)
print(a.group())  # 输出: 0731

# 匹配一个或多个字母、数字或下划线
text012 = "qwertttyu"
b = re.match(r'\w+', text012)
print(b.group())  # 输出: qwertttyu

# 匹配正好三个字母、数字或下划线
text013 = "abcd"
c = re.match(r'\w{3}', text013)
print(c.group())  # 输出: abc

# 匹配一个到八个字母、数字或下划线
text014 = "abcdefghijklmnop"
d = re.match(r'\w{1,8}', text014)
print(d.group())  # 输出: abcdefgh

基础案例一

import re

# 验证手机号码的正则表达式
text015 = "15110631111"
ret01 = re.match(r'1[3589]\d{9}', text015)
print(ret01.group())  # 输出: 15110631111

# 验证邮箱的正则表达式
text016 = "3200182199@qq.com"
ret02 = re.match(r'\w+@[a-z0-9]+\.[a-z]+', text016)
print(ret02.group())  # 输出: 3200182199@qq.com

# 验证URL的正则表达式
text017 = "https://movie.douban.com/j/search_subjects"
ret03 = re.match(r'(http|https|ftp)://[^\s]+', text017)
print(ret03.group())  # 输出: https://movie.douban.com/j/search_subjects

# 验证身份证的正则表达式
text018 = "1628493720856361x"
ret04 = re.match(r'\d{16}[\w]', text018)
print(ret04.group())  # 输出: 1628493720856361x

贪婪模式与非贪婪模式 :

# 匹配一个或多个数字(贪婪模式)
text019 = "123456789"
ret05 = re.match(r'\d+', text019)
print(ret05.group())  # 输出: 123456789

# 匹配一个或多个数字(非贪婪模式)
text020 = "123456789"
ret06 = re.match(r'\d+?', text020)
print(ret06.group())  # 输出: 1

# 匹配尖括号中的内容,使用非贪婪模式
text021 = "<h1>标题<h1>"
ret07 = re.match(r'<.+?>', text021)
print(ret07.group())  # 输出: <h1>

 这个正则表达式 <.+?> 用于匹配最短的以 < 开始、以 > 结束的字符串,即非贪婪匹配。在这里,它会匹配 <h1>

在正则表达式中,? 是一个量词修饰符,用于指定前面的匹配模式为非贪婪(或最小匹配)。通常情况下,正则表达式会尽可能多地匹配目标字符串,这被称为贪婪匹配。但当在量词后面添加 ? 时,它会使匹配变得非贪婪,即尽可能少地匹配目标字符串。

例如,在正则表达式 <.+?> 中,. 匹配任意字符,+ 表示匹配一个或多个前面的字符(.),而 ? 则表示将 + 量词变为非贪婪模式。这样,正则表达式会尽可能少地匹配目标字符串,直到找到第一个 > 结束标记。


基础案例二 

 转义字符和原生字符

# 转义字符和原生字符串

text023 = "apple price is $399"
ret09 = re.search(r'\$\d+', text023)
print(ret09.group())  # 输出: $399

text024 = "\\n"   # text024 = r"\n"
print(text024)  # 输出: \n

ret10 = re.search(r'\\n', text024)
print(ret10.group())  # 输出: \n


re函数模块:

分组:

import re

text025 = "apple price is $399 and orange price is $299"
ret10 = re.search(r'.*(\$\d+).*?(\$\d+)', text025)
print(ret10.group(1))  # 第一个价格 输出: $399
print(ret10.group(2))  # 第二个价格 输出: $299

re.search(pattern, string, flags=0):在字符串中搜索匹配正则表达式的第一个位置,并返回匹配对象

在正则表达式中,美元符号 $ 有两种不同的含义:

  1. 在正则表达式中,美元符号 $ 表示匹配字符串的结尾。例如,正则表达式 ^\d+$ 将匹配由数字组成的字符串,^ 表示字符串的开头,\d+ 表示一个或多个数字,而 $ 表示字符串的结尾。

  2. 美元符号 $ 也可以用作一个普通字符,表示字符串中的美元符号。在正则表达式中,为了匹配 $ 字符本身,需要使用转义字符 \,即 \。因此,\$ 将匹配字符串中的 $ 符号.


findall函数:

import re

text026 = "apple price is $399 and orange price is $299"
re11 = re.findall(r'\$\d+',text026)
print(re11)     # 输出:['$399', '$299']

re.findall(pattern, string, flags=0):在字符串中查找正则表达式匹配的所有子串,并返回一个包含所有匹配结果的列表。


sub函数: 

import re

text027 = "apple price is $399 and orange price is $299"
re12 = re.sub(r'\$\d+',"0",text027)
print(re12)     # 输出:apple price is 0 and orange price is 0

re.sub(pattern, repl, string, count=0, flags=0):用指定的字符串替换匹配正则表达式的子串,并返回替换后的字符串。


splist函数 :

import re

text028 = "hello world ni hao"
ret13 = re.split(r' ',text028)
print(ret13)    # 输出: ['hello', 'world', 'ni', 'hao']

re.split(pattern, string, maxsplit=0, flags=0):根据正则表达式匹配的模式将字符串分割成列表,并返回列表。