正则表达式

通过导入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 天前
正则指引——Ruby
开发语言·正则表达式·ruby
吴声子夜歌2 天前
正则指引——Golang
开发语言·golang·正则表达式
吴声子夜歌3 天前
正则指引——PHP
开发语言·正则表达式·php
吴声子夜歌5 天前
正则指引——断言
正则表达式
吴声子夜歌5 天前
正则指引——匹配原理
java·正则表达式
吴声子夜歌6 天前
正则表达式——环视
开发语言·正则表达式
吴声子夜歌7 天前
正则表达式——边界
正则表达式
营养充电站7 天前
C++23 新特性在 CLion 中的实战体验
macos·docker·jupyter·正则表达式
吴声子夜歌7 天前
正则表达式——字符组
正则表达式