正则表达式与re模块 正则表达式regex用于高级的文本模式的匹配,抽取,以及文本的搜索与替换 一. 常用regex的特殊字符使用. 匹配任意单一字符,除了\n换行符 (.匹配点号) chen.... , ..,.end ^ 或 \A 匹配字符串开始位置 ^Start $ 或 \Z 匹配字符串结尾位置 end$ \b 匹配单词的边界 \B 匹配在单词中间 \bthe , \bthe\b,\Bthe [ ] 匹配方括号里的任意一个字符 b[ajah]t [sd][jkl][kjkjk] [0-9] 数字 [a-zA-Z] 字母 [^aeiou] 不包括aeiou [^\t\n] 不匹配制表符和换行符 * 匹配0次或多次前面的正则表达式 尽可能多 + 匹配一次或多次 尽可能多 ? 匹配0次或一次 尽可能多 * + ? 都是贪婪匹配,会尽可能多地匹配,* ?,+?,??是非贪婪匹配,会尽可能少地匹配 {N} 匹配N次 {M,N} 匹配M到N次 {M,N}? 非贪婪版 ( ) 匹配封闭的正则表达式,然后另存为子组 ([0-9]{3})? \d 相当于 [0-9] \D 相当于 [^0-9] \w 相当于 [A-Wa-z0-9] \W 相当于 [^A-Wa-z0-9] \s 匹配任何空格字符,相当于 [\n\t\r\v\f] \S 与之相反 \d{4}-\d{7} 电话号码 0737-2837928等 拓展表示法 1.(?...) ?后的字符决定使用的模式,除了(?P<name>...),不建立分组
2.(?aiLmsux) 用在正则表达式之前,向其传递参数,
a 相当于re.A 只匹配ASCII码
i 相当于re.I 忽略大小写
L 相当于re.L 根据本地编码格式
m 相当于re.M 多行模式
s 相当于re.S 点号可以匹配所有,包括\n
u 相当于re.U Unicode matching
x 相当于re.X 可以将pattern分解成多行,并添加注释
3.(?:...) 匹配...,但不保留分组
4.(?P<name>...) 将分组命名为name
5.(?P=name) 调用之前的name分组
6.(?#...) 注释,会被忽略
7.(?=...) 'le(?=chen)' 只有后面是chen时才会匹配le
8.(?!...) 'le(?!chen)' 只有后面不是chen时才匹配le
9.(?<=...) 只有前面是...才匹配
10.(?<!...) 只有前面不是...才匹配
m = re.search(r'(?<=-)\w+','spam-egg')
m.group(0)
'egg'
11.(?(id/name)yes-pattern|no-pattern)
如果id/name分组存在则匹配yes-pattern,否则匹配no-pattern.
二.re函数re.compile(pattern,flags=0) 将正则语句编译成regular expression object,以供其他函数调用
prog = re.compile(pattern) result = prog.match(string) 相当于 result = re.match(pattern, string) re.search(pattern,string,flags=0) 搜索整个string,直到第一个pattern,返回相应的match object,如果没有,返回None re.match(pattern,string,flags=0) 在string开头匹配pattern,返回match object,否则返回None. 即使是多行模式,也只匹配开头部分. re.fullmatch(pattern,string,flags=0) 如果整个string能匹配pattern,返回match object,否则返回None re.split(pattern,string,maxsplit=0,flags=0) 以pattern分解string为列表,maxsplit为n时,切分n次,如果pattern由括号包围时,pattern会保留在列表内,开头和结尾有pattern时,列表里会有空字符串''. re.findall(pattern,string,flags=0) 返回string中所有能匹配pattern的matchs列表,相同的话,不会覆盖,当有一个以上分组时,返回元组列表,只匹配到一个的话,其他的为空字符串'' re.finditer(pattern,string,flags=0) 返回包含所有match的迭代器 re.sub(pattern,repl,string,count=0,flags=0) In [68]: re.sub('a|e','QQ','abcde')Out[68]: 'QQbcdQQ' 搜索并替换,repl可以是字符串,也可以是函数,count表示替换次数 $def dashrepl(matchobj): if matchobj.group(0) == '-': return ' ' else: return '-'$ re.sub('-{1,2}', dashrepl, 'pro----gram-files') $'pro--gram files' $ re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam',flags=re.IGNORECASE) $'Baked Beans & Spam' re.subn(pattern,repl,string,count=0,flags=0) 操作与sub()相同,不过是返回一个元组(new_string,n_of_subs) re.purge() 清除缓存的正则表达式
|