正则表达式

发布于:2025-03-26 ⋅ 阅读:(26) ⋅ 点赞:(0)

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

一.字符匹配

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

import re

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

['clocky7', 'clocky7']

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

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 遍历字符串,找到正则表达式匹配的第一个位置,返回匹配对象。

re.search('clocky7','he is a good clocky7')

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

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

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

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

['hqyj', 'hqyj']

[hqyj]匹配h或者q或者y或者j字符

# 这里引号要写在[]外,因为这个地方就是要填字符串
re.findall('[hqyj]','hqyj is a nice hqyj')

['h', 'q', 'y', 'j', 'h', 'q', 'y', 'j']

[^hqyj]匹配除了hqyj以外的其他字符

re.findall('[^hqyj]','hqyj is a nice hqyj')

[' ', 'i', 's', ' ', 'a', ' ', 'n', 'i', 'c', 'e', ' ']

[a-z]匹配a~z的任意字符([0-9]也可以)

re.findall('[a-z]','he is a 12345')

['h', 'e', 'i', 's', 'a']

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

re.findall('.','he is a 12345')

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

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

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']

三.特殊字符

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

['1', '2', '3']

# \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))

# \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))

# \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))

# \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))

# \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))

# \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 实际有一个需要注意的地方:

# \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

# \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']

四.数量控制

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

['clocky7', 'clocky77']

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

['7', '77']

# ?重复1次或0次

import re

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

['ky', 'kyy']

# {n}重复n次
import re

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

['ky66', 'ky66']

# {n,}重复n次或多次

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

['ky666', 'ky66']

# {n,m}重复n到m次

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

['ky666', 'ky66', 'ky666']

五.分组

- () 提取兴趣区域

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

import re

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

['7', '78898']

- (|) 提取兴趣区域(| = or)

import re

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

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

六.开始与结束

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

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

['clocky7']

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

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函数

import re
s = 'clocky7 is a clock'
print(re.sub('clocky7','MOl',s))

MOl is a clock

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

import re
s = 'clocky7 like6 arknights'
print(re.split(r'\d+',s))

['clocky', ' like', ' arknights']


网站公告

今日签到

点亮在社区的每一天
去签到