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'
#无分组 r = 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))' ]
|