python(九)re模块

时间:2023-03-09 09:11:21
python(九)re模块

python中re模块提供了正则表达式相关操作。

1、 字符串匹配:

  • .    匹配除换行符以外的任意字符

  • \w 匹配字符或数字或下划线或汉字

  • \s  匹配任意空白字符

  • \d 匹配数字

  • \b 匹配单词的开始或结束

  • ^  匹配字符串的开始

  • $   匹配字符串的结束

2、字符串次数匹配:

  • * 重复0次或多次

  • + 重复1次或多次

  • ?  重复0次或1次

  • {n} 重复n次

  • {n,} 重复n次或更多次

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

3、re模块的方法

方法一:match

match:从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None.

1
2
3
4
#格式:re.match(pattern,string,flags=0)
#     pattern: 正则模型      
#     string:要匹配的字符串 
#     flags:匹配模式

举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#无分组
import re
  
str='hello,jack123'
  
r=re.match('h\w+',str)
print(r.group())        #获取匹配到的所有结果
print(r.groups())       #获取模型中匹配到的分组结果
print(r.groupdict())    #匹配模型中匹配到的分组结果
  
#结果:
hello
  
#有分组
#分组:为了提取匹配成功的指定内容(先匹配成功全部正则,然后再将匹配成功的局部内容提取出来)
  
r1=re.match('h(?P<name>\w+).*k(\d+)',str)
print(r1.group())       #获取匹配到的所有结果
print(r1.groups())      #获取模型中匹配到的分组结果
print(r1.groupdict())   #获取模型中匹配到的分组中所有 执行了key的组
  
#结果:
hello,jack123
('ello''123')
{'name''ello'}

方法二:search

search: 浏览整个字符串去匹配第一个,为匹配成功返回None,这里强调一下match方法是从开头去匹配。

格式: search(pattern,string,flags=0)

举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import re
str='123hello,jack123'
#无分组
r=re.search('h\w+',str)
print(r.group())         #获取匹配到的所有结果
print(r.groups())        #获取模型中匹配到的分组结果
print(r.groupdict())     #获取模型中匹配到的分组结果
#结果:
hello
()
{}
#有分组
r=re.search('h(?P<name>\w+).*k(?P<age>\d+)',str)
print(r.group())         #获取匹配到的所有结果
print(r.groups())        # 获取模型中匹配到的分组结果
print(r.groupdict())     # 获取模型中匹配到的分组中所有执行了key的组
#结果:
hello,jack123
('ello''123')
{'age''123''name''ello'}

方法三:findall

findall:获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中多个组,则以列表形式返回,且每一个匹配均是元组;空的匹配也会包含在结果中。

格式:findall(pattern,string,flags=0)

举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import re
str='123hello,jack123'
#无分组
= re.findall('h\w+',str)
print(r)
#结果:
['hello']
#有分组
r1= re.findall('h(\w+)',str)
print(r1)
#结果:
['ello']

方法四:sub

sub:替换匹配成功的指定位置的字符串

1
2
3
4
5
6
#格式:sub(pattern,repl,string,count=0,flags=0)
#pattern:正则模型
#repl   :要替换的字符串或可执行对象
#string :要匹配的字符串
#count  :指定匹配个数
#flags  :匹配模式

举例说明:

1
2
3
4
5
6
7
8
import re
  
str='123hello,jack123hello'
r=re.sub("h\w+",'456',str,1)   #将字符串hello替换成456,后面这个flags=1是匹配到结果后,如果是多个只替换一个,默认是全部替换
print(r)
#结果:
123456,jack123hello

方法五:split

split:根据正则匹配分割字符串

1
2
3
4
5
#格式:split(pattern, string, maxsplit=0, flags=0)
# pattern: 正则模型
# string : 要匹配的字符串
# maxsplit:指定分割个数
# flags  : 匹配模式

举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import re
str='123hello,jack123hello'
#无分组
r=re.split('hello',str,1)
print(r)
#结果:
['123'',jack123hello']
#有分组
r1=re.split('(hello)',str,1)
print(r1)
r2=re.split('(h(ell)o)',str,1)    #可以通过括号多切分几层,取到自己满意的结果为止
print(r2)
#结果:
['123''hello'',jack123hello']
['123''hello''ell'',jack123hello']
1
2
3
4
5
6
7
inpp = '1-2*((60-30 +(-40-5)*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))'
inpp = re.sub('\s*','',inpp)                #将空格替换成空
new_content = re.split('\(([\+\-\*\/]?\d+[\+\-\*\/]?\d+){1}\)', inpp, 1)
print new_content
#结果:
['1-2*((60-30+''-40-5''*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']