python正则表达式学习

正则表达式基础

Python的正则表达式依赖于re模块:

1
import re

基本结构为:
string –> Pattern –> Match –>result

简单示例:

1
2
3
4
5
6
import re
str1 = 'Dlala is dlala'
pa = re.compile(r'Dlala') #r表示原字符串
ma = pa.match(str1)
result = ma.group()
print result

另一个基本示例:

1
2
3
4
5
import re
str1 = 'Dlala is dlala'
ma = re.match(r'Dlala', str1)
result = ma.group()
print result

正则表达式语法(匹配单个字符):

字符 匹配 示例
. 匹配任意字符(除\n外) re.match(r’.’,’d’)
[…] 匹配字符集 re.match(r’[a-zA-Z0-9]’,’d’)
\d / \D 匹配数字 / 非数字 re.match(r’\d’, ‘0’)
\s / \S 匹配空白 / 非空白字符 re.match(r’\s’, ‘ ‘)
\w / \W 匹配单词字符[a-zA-Z0-9] / 非单词字符 re.match(r’\w’, ‘d’)

正则表达式语法(匹配多个字符):

字符 匹配 示例
* 匹配前一个字符0到无限次 re.match(r’[A-Z][a-z]*’, ‘Dlala123’)
+ 匹配前一个字符1到无限次 ma = re.match(r’[_a-zA-Z]+[\w]*’, ‘_Dlala123’)
? 匹配前一个字符0次或1次 ma = re.match(r’[1-9]?[0-9]*’,’76’)
{m} / {m,n} 匹配一个字符m次 / m到n次 ma = re.match(r’[0-9A-Za-z]{6,9}@mail.com’, ‘dwk715@mail.com’)
*? / +? / ?? 匹配模式变为非贪婪(尽可能减少匹配字符) 0次,1次,0次

Python re模块

re模块有很多个方法,下面介绍一下:

search(pattern, string, flags=0)
在一个字符串中查找匹配

类似于字符串的find

1
2
3
4
import re
str1 = "we have 1000 seed"
info = re.search(r'\d+', str1)
print(info.group()) #1000

findall(pattern, string, flags=0)
找到匹配,返回所有匹配部分的列表

1
2
3
4
5
import re
str1 = "javascript=80, python=88, html=100"
info = re.findall(r'\d+', str1)
print(info)
print('sum is', sum(int(x) for x in info))

1
2
3
4
5
6
sub(pattern, repl. string, count=0, flags=0)
#pattern 正则表达式
#repl 替换的字符串或者函数表达式
#string 被替换的字符串
#count 替换次数限制
#flags

将字符串中匹配正则表达式的部分替换为其他值

1
2
3
4
import re
str1 = 'Dlala is 22 years old'
info = re.sub(r'\d+', '23', str1)
print(info)
1
2
3
4
5
6
7
8
9
import re
str1 = 'Dlala is 22 years old'
def addOne(match):
val = match.group()
age = int(val) + 1
return str(age)

#这里的match是正则表达式匹配到的部分
print(re.sub(r'\d+', addOne, str1))

1
2
split(pattern, string, maxsplit=0, flags=0)
# maxsplit为分割的次数
1
2
3
4
import re
str1 = "I'm learning:python, javascript, html and css"
info = re.split(r':|, | and ', str1)
print(info)