Python 正则 (3)

提前编译可减少多次正则匹配的运行时间

语法 import re re.compile(pattern, flags=0) """ pattern : 匹配的正则表达式 flags : 可选标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见上方可选标志表格 """ 例子 import re msg =re.compile('<div>(.*)</div>') ret = msg.findall('<div>商品信息</div>') print(ret) # ['商品信息'] re.findall()

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

match 和 search 是匹配一次 findall 匹配所有。

语法 re.findall(pattern, string, flags=0) """ pattern : 匹配的正则表达式 string : 要匹配的字符串 flags : 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见上方可选标志表格 """ 实例 import re ret = re.findall('my', 'my name is monkey,my phone number is xxxx') # ['my', 'my'] re.finditer()

和 findall 类似,findall() 匹配字符串中的所有结果返回列表,finditer()返回一个迭代器。

语法 re.finditer(pattern, string, flags=0) """ pattern : 匹配的正则表达式 string : 要匹配的字符串 flags : 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见上方可选标志表格 """ 实例 import re ret = re.findall('my', 'my name is monkey,my phone number is xxxx') # <callable_iterator object at 0x109852518> re.split()

split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下

语法 re.split(pattern, string[, maxsplit=0, flags=0]) """ """ 实例 import re ret = re.split(',+', 'name:monkey,gender:male,addr:xxxxx,,,,hobby:lady') print(ret) # ['name:monkey', 'gender:male', 'addr:xxxxx', 'hobby:lady'] re.sub()

Python 的re模块提供了re.sub用于替换字符串中的匹配项。

语法 re.sub(pattern, repl, string, count=0, flags=0) """ pattern : 必填 模式字符串。 repl : 必填 替换的字符串对象,也可为一个函数对象。 string : 必填 要被查找替换的原始字符串。 count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。 flags : 编译时用的匹配模式,数字形式 缺省为 0 """

前三个为必选参数,后两个为可选参数。

实例 # 将所有年龄改成18岁 msg = 'name:monkey,age:100;' \ 'name:hook,age:80;' \ 'name:black,age:90;' r = re.sub(':\d+;', ':18;', msg, count=0) # name:monkey,age:18;name:hook,age:18;name:black,age:18; 分组与命名 分组

以括号()包裹起来,叫一个分组。分组是可以嵌套的

msg = 'name:monkey,age:100;' r = re.match('name:(\w+),age:(\d+)', msg) print(r.groups()) # ('monkey', '100') 命名

Django 1.x 版本的URLconf 中使用命名匹配来提取URL参数

msg = 'name:monkey,age:100;' r = re.match('name:(?P<name>\w+),age:(?P<age>\d+)', msg) print(r.groupdict()) # {'name': 'monkey', 'age': '100'} 贪婪匹配 re.match(r'^(\d+)(0*)$', '102300').groups() ('102300', '')

正则默认是贪婪的,也就是说会尽可能多的去匹配字符。

由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。

如果希望分开匹配,那必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:

re.match(r'^(\d+)(0*)$', '102300').groups() ('1023', '00') 正则表达式一些实例 字符匹配 re meaning
python   匹配 "python"  
[Pp]ython   匹配 "Python" 或 "python"  
rub[ye]   匹配 "ruby" 或 "rube"  
[aeiou]   匹配中括号内的任意一个字母  
[0-9]   匹配任何数字。类似于 [0123456789] [a-z] 匹配任何小写字母  
[A-Z]   匹配任何大写字母  
[a-zA-Z0-9]   匹配任何字母及数字  
[^aeiou]   除了aeiou字母以外的所有字符  
[^0-9]   匹配除了数字外的字符  

特殊字符类

re meaning
.   匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。  
\d   匹配一个数字字符。等价于 [0-9]。  
\D   匹配一个非数字字符。等价于 [^0-9]。  
\s   匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。  
\S   匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。  
\w   匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。  
\W   匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdggp.html