正则表达式

通过导入re模块,使得程序可以使用正则表达式。

一.字符匹配

findall(x,str) 遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回。

python 复制代码
import re

re.findall('clocky7','clocky7 is a nice clocky7')

'clocky7', 'clocky7'

match 判断一个正则表达式是否从开始处匹配一个字符串。

python 复制代码
x = re.match('clocky7','clocky7 is a nice clocky7')
print(x)

y = re.match('is','clocky7 is a nice clocky7')
print(y)

<re.Match object; span=(0, 7), match='clocky7'>

None

search 遍历字符串,找到正则表达式匹配的第一个位置,返回匹配对象。

python 复制代码
re.search('clocky7','he is a good clocky7')

<re.Match object; span=(13, 20), match='clocky7'>

finditer() 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回

python 复制代码
r = re.finditer('ky','clocky is a good 1ky1')
print(type(r))
for i in r:
    print(i)

<class 'callable_iterator'>

<re.Match object; span=(4, 6), match='ky'>

<re.Match object; span=(18, 20), match='ky'>

二.正则的规则

hqyj匹配文本中的hqyj

python 复制代码
re.findall('hqyj','hqyj is a nice hqyj')

'hqyj', 'hqyj'

hqyj\]匹配h或者q或者y或者j字符 ```python # 这里引号要写在[]外,因为这个地方就是要填字符串 re.findall('[hqyj]','hqyj is a nice hqyj') ``` > \['h', 'q', 'y', 'j', 'h', 'q', 'y', 'j'

\^hqyj\]匹配除了hqyj以外的其他字符 ```python re.findall('[^hqyj]','hqyj is a nice hqyj') ``` > \[' ', 'i', 's', ' ', 'a', ' ', 'n', 'i', 'c', 'e', ' '

a-z\]匹配a\~z的任意字符(\[0-9\]也可以) ```python re.findall('[a-z]','he is a 12345') ``` > \['h', 'e', 'i', 's', 'a'

. 匹配除了换行符以外的任意字符,空字符也可以返回

python 复制代码
re.findall('.','he is a 12345')

'h', 'e', ' ', 'i', 's', ' ', 'a', ' ', '1', '2', '3', '4', '5'

. 后还可以添加字符匹配,其表示(默认)匹配一个任意字符加上特定字符匹配

python 复制代码
a = re.findall('.12','he is a 12345')
print(a)

#贪婪匹配(匹配最长的)
b = re.findall('.+12','he is a 12345')
print(b)

# 可以是没有字符(空),用 - 表示
c = re.findall('.+?12','12 he is a 12345')
print(c)

' 12'

'he is a 12'

'12 he is a 12'

三.特殊字符

python 复制代码
import re
# \d 匹配任何十进制数字;相当于类 [0-9]
re.findall(r'\d', 'abc123')

'1', '2', '3'

python 复制代码
# \D与 \d 相反,匹配任何非十进制数字的字符;相当于类 [^0-9]
import re
s = '123abc456'
print(re.findall('\D',s))

'a', 'b', 'c'

<>:4: SyntaxWarning: invalid escape sequence '\D'

<>:4: SyntaxWarning: invalid escape sequence '\D'

C:\Users\Clocky7\AppData\Local\Temp\ipykernel_18016\3487280925.py:4: SyntaxWarning: invalid escape sequence '\D'

print(re.findall('\D',s))

python 复制代码
# \s 匹配任何空白字符(包含空格、换行符、制表符等);相当于类 [  \t\n\r\f\v]
s = 'a\tb\nc\td'
print(re.findall('\s',s))

'\\t', '\\n', '\\t'

<>:3: SyntaxWarning: invalid escape sequence '\s'

<>:3: SyntaxWarning: invalid escape sequence '\s'

C:\Users\Clocky7\AppData\Local\Temp\ipykernel_18016\4213507675.py:3: SyntaxWarning: invalid escape sequence '\s'

print(re.findall('\s',s))

python 复制代码
# \S 与 \s 相反,匹配任何非空白字符
import re
s = 'a\tb\tc'
print(re.findall('\S',s))

'a', 'b', 'c'

<>:4: SyntaxWarning: invalid escape sequence '\S'

<>:4: SyntaxWarning: invalid escape sequence '\S'

C:\Users\Clocky7\AppData\Local\Temp\ipykernel_18016\108571978.py:4: SyntaxWarning: invalid escape sequence '\S'

print(re.findall('\S',s))

python 复制代码
# \w 匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式[a-zA-Z0-9_]

s = 'hello world_1234\t\n'
print(re.findall('\w',s))

'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '_', '1', '2', '3', '4'

<>:4: SyntaxWarning: invalid escape sequence '\w'

<>:4: SyntaxWarning: invalid escape sequence '\w'

C:\Users\Clocky7\AppData\Local\Temp\ipykernel_18016\159184317.py:4: SyntaxWarning: invalid escape sequence '\w'

print(re.findall('\w',s))

python 复制代码
# \W 与 \w 相反  (注:re.ASCII 标志使得 \w 只能匹配 ASCII 字符)
import re
s = 'a1b2c3d4e5f6 g7h8i9j0'
print(re.findall('\W',s))

' '

<>:4: SyntaxWarning: invalid escape sequence '\W'

<>:4: SyntaxWarning: invalid escape sequence '\W'

C:\Users\Clocky7\AppData\Local\Temp\ipykernel_18016\603422700.py:4: SyntaxWarning: invalid escape sequence '\W'

print(re.findall('\W',s))

python 复制代码
# \b 匹配一个单词边界,也就是指单词和空格间的位置。
# 例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
import re
s = 'clocky7 ikys a nice clocky'
t = re.findall(r'ky\b',s)
print(t)

'ky'

关于 \b 实际有一个需要注意的地方:

python 复制代码
# \b 在系统中可能作为其他字符的转义字符,比如 \n \t 等,\b表示退格,前面的一个字符会消失。所以在正则表达式中,最好在字符串前加r
import re
s = 'clocky7 is a nice clocky'

# 可见此处,\b已经不是正则表达式的元字符了,因此没法匹配
t = re.findall('ky\b',s)
print(t)


#测试\b,应该输出lve
print ("test \\b  :lo\bve") 

test \b :lve

python 复制代码
# \B 与 \b 相反,'er\b' 不能匹配"never" 中的 'er',但能匹配 "verb" 中的 'er'。
import re
s = 'clocky7 ikys a nice clocky'
t = re.findall(r'ky\B', s)

print(t)

'ky', 'ky'

四.数量控制

python 复制代码
import re
# *重复0次或多次
s = 'clocky7 is_a nice clocky77'
print(re.findall('clocky7*',s))

'clocky7', 'clocky77'

python 复制代码
# +重复1次或多次
s = 'clocky7 is_a nice clocky77'
print(re.findall('7+',s))

'7', '77'

python 复制代码
# ?重复1次或0次

import re

s = 'clocky7 is a nice clockyy7'
print(re.findall('kyy?', s))

'ky', 'kyy'

python 复制代码
# {n}重复n次
import re

s = 'clocky666 is a clocky66'
print(re.findall('ky6{2}', s))

'ky66', 'ky66'

python 复制代码
# {n,}重复n次或多次

import re
s = 'clocky666 is a clocky66'
print(re.findall('ky6{2,}', s))

'ky666', 'ky66'

python 复制代码
# {n,m}重复n到m次

import re
s = 'clocky666 is a clocky66,and clocky6666666'
print(re.findall('ky6{2,3}',s))

'ky666', 'ky66', 'ky666'

五.分组

  • **()**提取兴趣区域

其前后可以规定字符,最终输出的是括号的要求的表达式。

python 复制代码
import re

s = 'clocky7 is a nice clocky78898'
print(re.findall(r'clocky(\d+)', s))

'7', '78898'

  • **(|)**提取兴趣区域(| = or)
python 复制代码
import re

s = '伊内斯得了MVP,琴柳得了MVP,温蒂得了MVP,维什戴尔得了MVP'
print(re.findall(r'(\w{2,})得了MVP', s))

'伊内斯', '琴柳', '温蒂', '维什戴尔'

六.开始与结束

^ 表示从字符串开头进行操作,不去找下面的字符

python 复制代码
import re
s = "clocky7 is a good clocky8"
print(re.findall(r"^clocky\d", s))

'clocky7'

$ 表示从字符串结尾进行操作,不去找前面的字符

python 复制代码
import re
s = "clocky7 is a good clocky8"
print(re.findall(r'clocky\d$', s))

'clocky8'

注意:由于正则表达式中 * . \ {} () 等等符号具有特殊含义,如果你指定的字符正好就是这些符号,需要用 \ 进行转义

七.正则表达式常见方法

由于前面提过了 findall() , match() , **serch()**方法,接下来介绍一些不同的:

sub(a,b,c) 替换匹配成功的字符,a是被替换的,b是替换上去的,c是字符串

类似与字符串的replace函数

python 复制代码
import re
s = 'clocky7 is a clock'
print(re.sub('clocky7','MOl',s))

MOl is a clock

split 根据匹配成功的位置对字符串进行分割

python 复制代码
import re
s = 'clocky7 like6 arknights'
print(re.split(r'\d+',s))

'clocky', ' like', ' arknights'

相关推荐
智能编织者2 天前
深入解析 Python 正则表达式:全面指南与实战示例
python·mysql·正则表达式
課代表2 天前
VBA 中正则表达式使用指南
数据库·mysql·正则表达式·excel
南隅。2 天前
【C++】基础3——正则表达式,静态多态(函数重载和模板),异常处理
开发语言·c++·正则表达式
BabyFish133 天前
notepad++ 正则表达式
正则表达式·notepad++
奕奕星空4 天前
MySQL中数据处理小技巧
mysql·正则表达式
活跃家族4 天前
正则表达式-万能表达式
正则表达式
宋康4 天前
Qt正则表达式QRegularExpression
数据库·qt·正则表达式
~夕上林~4 天前
正则表达式-笔记
笔记·正则表达式
通信小枫4 天前
vsCode中的正则表达式
ide·vscode·正则表达式
一只小风华~4 天前
鸿蒙harmonyOS:笔记 正则表达式
前端·笔记·华为·正则表达式·harmonyos