python正则表达式re
- 重要的函数
compile(pattern[, flags]) 根据包含正则表达式的字符串创建模式对象,提高匹配效率,search match 均在内部进行了compile转换;
search(pattern, string[, flags]) 在字符串中查找模式 ,返回第一个查找的子串的MatchObject;
match(pattern, string[, flags]) 在字符串开头匹配模式 ,忽略字符串多余的尾部,若要全匹配,模式添加$,表示结尾;
split(pattern, string[, maxsplit=0]) 根据模式来分割字符串 ,如果模式包含圆括号,将在分割得到的子串之间插入括号中的内容,例如,re.split(‘o(o)’, ‘foobar’)的结果为[‘f’, ‘o’, ‘bar’],指定maxsplit最多分割多少次;
findall(pattern, string) 返回一个列表,其中包含字符串中所有与模式匹配的子串 ;
sub(pat, repl, string[, count=0]) 将字符串中与模式pat匹配的子串都替换为repl ;
escape(string) 对字符串中所有的正则表达式特殊字符都进行转义,即添加转义符 。
- MatchObject的编组
以模式中的左括号序号为编号分组,整个模式为编组0,依次为1,2,3,,,99。
MatchObject方法:
group()返回编组对应子串;
start()end()span()分别返回对应编组开始,结束,范围的子串位置。
- 替换的分组
在模式串中使用VERBOSE可以忽略模式串中的空格,制表,换行;
>>> re.sub(emphasis_pattern, r'<em>\1</em>', 'Hello, *world*!')
>'Hello, <em>world</em>!'
- 非贪婪模式
对于所有的重复运算符,都 可在后面加上问号来将其指定为非贪婪的。
- 模板系统
# templates.py
import fileinput, re
# 与使用方括号括起的字段匹配
field_pat = re.compile(r'\[(.+?)\]')
# 我们将把变量收集到这里:
scope = {}
# 用于调用re.sub:
def replacement(match):
code = match.group(1)
try: # 如果字段为表达式,就返回其结果:
return str(eval(code, scope))
except SyntaxError: # 否则在当前作用域内执行该赋值语句
# 并返回一个空字符串
return ''
# 获取所有文本并合并成一个字符串:
lines = []
for line in fileinput.input():
lines.append(line)
text = ''.join(lines)
# 替换所有与字段模式匹配的内容:
print(field_pat.sub(replacement, text))