Python 正则表达式函数

时间:2024-10-09 10:32:01
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.']