# encoding: UTF-8 import re rule = r'hello.*\!' # 正则表达式规则 : 匹配 hello 开头, ! 结尾的字符串 # 将正则表达式编译成 Pattern 对象 pattern = re.compile(rule) # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None match = pattern.match('hello, hanxiaoyang! How are you?') if match: # 使用Match获得分组信息 print(match.group())
hello, hanxiaoyang! How are you?
regex_1 = re.compile(r"""\d + # 数字部分 \. # 小数点部分 \d * # 小数的数字部分""", re.X) regex_2 = re.compile(r"\d+\.\d*") regex_1, regex_2
(re.compile(r'\d + # 数字部分\n \. # 小数点部分\n \d * # 小数的数字部分', re.UNICODE|re.VERBOSE), re.compile(r'\d+\.\d*', re.UNICODE))
Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。
match属性:
方法:
import re # \w : 表示单词字符 : [a-z0-9] rule = '(\w+) (\w+) (?P<sign>.*)' m = re.match(rule, 'hello ni hao ya!') print("匹配时使用的文本 : ", m.string) print("匹配时使用的Pattern对象 : ", m.re) print("文本中正则表达式开始搜索的索引 : ", m.pos) print("文本中正则表达式结束搜索的索引 : ", m.endpos) print("最后一个被捕获的分组在文本中的索引 : ", m.lastindex) print("最后一个被捕获的分组的别名 : ", m.lastgroup) print("m.group(1, 2) : ", m.group(1, 2)) print("m.groups() : ", m.groups()) print("m.groupdict() : ", m.groupdict()) print("m.start(2) : ", m.start(2)) print("m.end(2) : ", m.end(2)) print("m.span(2) : ", m.span(2)) print(m.expand(r'\2 \1 \3'))
匹配时使用的文本 : hello ni hao ya! 匹配时使用的Pattern对象 : re.compile('(\\w+) (\\w+) (?P<sign>.*)') 文本中正则表达式开始搜索的索引 : 0 文本中正则表达式结束搜索的索引 : 16 最后一个被捕获的分组在文本中的索引 : 3 最后一个被捕获的分组的别名 : sign m.group(1, 2) : ('hello', 'ni') m.groups() : ('hello', 'ni', 'hao ya!') m.groupdict() : {'sign': 'hao ya!'} m.start(2) : 6 m.end(2) : 8 m.span(2) : (6, 8) ni hello hao ya!
import re rule = '(\w+) (\w+)(?P<sign>.*)' # r'' 是为了防止字符转义 p = re.compile(rule, re.DOTALL) # re.S(DOTALL): 点任意匹配模式,改变'.'的行为 print("编译时用的表达式字符串: " , p.pattern) print("编译时用的匹配模式。数字形式: " , p.flags) print("表达式中分组的数量: " , p.groups) print("p.groups: " , p.groupindex)
编译时用的表达式字符串: (\w+) (\w+)(?P<sign>.*) 编译时用的匹配模式。数字形式: 48 表达式中分组的数量: 3 p.groups: {'sign': 3}
import re # 将正则表达式编译成 Pattern 对象 rule = r'W.*i' pattern = re.compile(rule) # 匹配规则以 W 开头, i结尾, 中间可以是任意字符 # 使用search()查找匹配的子串,不存在能匹配的子串时将返回None # 这个例子中使用match()无法成功匹配 text = 'Hello, Wangtianci!' match = pattern.search(text) if match: # 使用Match获得分组信息 print(match.group())
Wangtianci
import re rule = r'\d+' # 表示 \d : 0 ~ 9 == [0-9] p = re.compile(rule) print(p.split('one1two2three3four4'))
['one', 'two', 'three', 'four', '']
import re rule = r'\d+' # 表示 \d : 0 ~ 9 == [0-9] p = re.compile(rule) print(p.findall('one1two2three3four4'))
['1', '2', '3', '4']
import re rule = r'[a-z]+' # 匹配字母的字符串 text = 'aaa1bbb2ccc3ddd4' p = re.compile(rule) for m in p.finditer(text): print(m.group())
aaa bbb ccc ddd
rule = r'\d+' # 匹配字母的字符串 text = 'aaa1bbb2ccc3ddd' p = re.compile(rule) # repl : 字符串 print(p.sub(',', text)) # 替换掉匹配的字符 # repl : 方法 def func(m): # m : <re.Match object; span=(3, 4), match='1'> print(m) # return m.group(0).title() + ' ' + m.group(1).title() return ',' print(p.sub(func, text))
aaa,bbb,ccc,ddd <re.Match object; span=(3, 4), match='1'> <re.Match object; span=(7, 8), match='2'> <re.Match object; span=(11, 12), match='3'> aaa,bbb,ccc,ddd
rule = r'\d+' # 匹配字母的字符串 text = 'aaa1bbb2ccc3ddd' p = re.compile(rule) # repl : 字符串 print(p.subn(',', text)) # 返回替换次数
('aaa,bbb,ccc,ddd', 3)