Python 正则表达式函数
import re
'''
正则表达式
'''
'''
1、函数
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none
语法:(pattern, string, flags=0)
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
'''
print(re.match('www', '').span()) # 在起始位置匹配 (0, 3)
print(re.match('com', '')) # 不在起始位置匹配 None
'''
2、方法
扫描整个字符串并返回第一个成功的匹配。
函数语法:
(pattern, string, flags=0)
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
PS: 与的区别
只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 匹配整个字符串,直到找到一个匹配。
'''
print(re.search('www', '').span()) # 在起始位置匹配 (0, 3)
print(re.search('com', '').span()) # 不在起始位置匹配 (11, 14)
'''
3、
用于替换字符串中的匹配项
语法: (pattern, repl, string, count=0, flags=0)
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags : 编译时用的匹配模式,数字形式。
'''
phone = "2004-959-559 # 这是一个电话号码"
# 删除注释
num = re.sub(r'#.*$', "", phone)
print("电话号码 : ", num) # 电话号码 : 2004-959-559
# 移除非数字的内容
num = re.sub(r'\D', "", phone)
print("电话号码 : ", num) # 电话号码 : 2004959559
'''
4、compile 函数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
语法:
(pattern[, flags])
pattern : 一个字符串形式的正则表达式
flags 可选,表示匹配模式,比如忽略大小写,多行模式等
'''
pattern = re.compile(r'\d+')
pattern = re.compile(r'\d+') # 用于匹配至少一个数字
m1 = pattern.match('one12twothree34four') # 查找头部,没有匹配
print(m1) # None
m2 = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配
print(m2) # None
m3 = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
print(m3) # < object; span=(3, 5), match='12'>
print(m3.group()) # 12
print(m3.group(0)) # 12
print(m3.start(0)) # 3
print(m3.end(0)) # 5
print(m3.span(0)) # (3, 5)
'''
在上面代码中:
当匹配成功时返回一个 Match 对象,其中:
group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);
start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
span([group]) 方法返回 (start(group), end(group))。
'''
pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # 表示忽略大小写
m = pattern.match('Hello World Wide Web')
print(m) # < object; span=(0, 11), match='Hello World'>
print(m.group(0)) # Hello World
print(m.group(1, 2)) # ('Hello', 'World')
print(m.group(1)) # Hello
'''
5、findall
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
语法格式为:
(pattern, string, flags=0)
或
(string[, pos[, endpos]])
pattern 匹配模式。
string 待匹配的字符串。
pos 可选参数,指定字符串的起始位置,默认为 0。
endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。
'''
result1 = re.findall(r'\d+', 'runoob 123 google 456')
pattern = re.compile(r'\d+') # 查找数字
result2 = pattern.findall('runoob 123 google 456')
result3 = pattern.findall('run88oob123google456', 0, 10)
print(result1) # ['123', '456']
print(result2) # ['123', '456']
print(result3) # ['88', '12']
# 多个匹配模式
result = re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10')
print(result) # [('width', '20'), ('height', '10')]
'''
6、
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
语法:(pattern, string, flags=0)
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位
'''
it = re.finditer(r"\d+","12a32bc43jf3")
for match in it:
print (match.group())
'''
7、
split 方法按照能够匹配的子串将字符串分割后返回列表。
语法:(pattern, string[, maxsplit=0, flags=0])
pattern 匹配的正则表达式
string 要匹配的字符串。
maxsplit 分割次数,maxsplit=1 分割一次,默认为 0,不限制次数。
flags 标志位,
'''
print(re.split('\W+', 'runoob, runoob, runoob.')) # ['runoob', 'runoob', 'runoob', '']
print(re.split('(\W+)', ' runoob, runoob, runoob.')) # ['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
print(re.split('\W+', ' runoob, runoob, runoob.', 1)) # ['', 'runoob, runoob, runoob.']