re模块

正则表达式:可以匹配文本片段的模式(匹配模式pattern)

字符串也是一种简单的正则表达式

 

通配符(可以匹配任何字符):.

如'.ython'可以匹配'python', 也可以匹配'jython'

 

字符集:用中括号[]括起来的字符集

如'[a-z]','[0-9]','[a-z-0-9]'分别表示字符a到z,0到9,a到z和0到9的任意一个

 

子模式(subpattern):模式中的一部分,用括号括起来

如'py(tho)n','tho'为一个子模式,也叫组(group),组序号取决于他左侧的括号数,整个模式字符串为第0组('python'),'tho'为第1组(左侧1个括号)

 

(pattern)*:允许模式重复0次或多次

(pattern)+:允许模式重复1次或多次

(pattern){m, n}:允许模式重复m到n次

如'py(tho)+n'表示中间的'tho'(第1组)可以重复1次或多次,可以匹配'python',也可以匹配'pythothothon'

 

反转字符集:^

如'[^abc]'表示可以匹配除a,b,c外的任何字符(注意加中括号!)

注意:若^出现在模式的开头,需要对其进行转义

 

管道符号:|(或)

如'p(ython|attern)'可匹配'python',也可匹配'pattern'

 

转意符号(对特殊字符进行转义):\

如果模式中有.,+,-,*,^,|,]等对匹配模式有特殊意义的符号,则需要进行转义,如模式'www\.python\.org'中的.表示字符'.',而不是通配符

 

可选项:在子模式的括号外加?号,表示这个子模式可有可无

如r'(http://)?(www\.)?python\.org'

可以匹配以下字符串:

'http://www.python.org'

'http://python.org'

'www.python.org'

'python.org'

注意:如果?号在子模式的括号内,表示非贪婪模式,默认情况下是贪婪模式,指出现重复运算符时,会尽可能多的匹配,

如pattern = r'\*(.+)\*',遇到子字符串'*this* is *it*!'时,匹配的是最前面和最后面的*号,

如果令pattern = r'\*(.+?)\*',?号在括号内,则表示非贪婪模式,尽可能少的匹配,会匹配前两个*号,再匹配后两个*号

 

匹配字符串开头或结尾:如果只想匹配在开头或结尾出现模式的字符串,模式可以用^(开头)或$(结尾)

如pattern = '^ht+p'(注意不同于反转字符集)会匹配'http://python.org','htttttttp://python.org',但不会匹配'python.http://org'

同理'$ht+p'会会匹配在结尾处出现模式的字符串

 

re.compile(pattern[, flags])

将以字符串形式写的pattern转为真正的模式对象

如:

1  pattern = re.compile(r'''
2       \*               # some text
3       ([^\*]+)     # some text 
4       \*               # some text
5        ''', re.VERBOSE)

表示字符串'\*([^\*]+)\*'被转换为匹配模式,VERBOSE表示re会忽略在模式中添加的空白(空白字符,tab,换行符等)

 

re.search(pattern, string[, flags])  或者  pat.search(string)

在字符串中寻找和模式相匹配的第一个子字符串,若能找到会返回MatchObject(值为Ture),否则返回None(值为False),如:

1 if re.search(pat, string):
2     print('found it!')

 

re.match(pattern, string[, flags])

在给定字符串开头处匹配,有就返回MatchObject(值为Ture),否则返回None(值为False),

如re,match('p', 'python')返回MatchObject,re.match('p', 'www.python.org')返回None

 

re.split(pattern, string[, maxsplit=0])

用与模式相匹配的匹配项来分割字符串,如:

1 some_text = 'alpha, beta,,,, gamma delta'
2 print(re.split(',+', some_text))

结果:

['alpha', ' beta', ' gamma delta']

如果改成:

1 some_text = 'alpha, beta,,,, gamma delta'
2 print(re.split('[, ]+', some_text))

结果:

['alpha', 'beta', 'gamma', 'delta']

(如果模式包含小括号,括起来的字符组合会散布在分割后的子字符串之间)

 

re.findall(pattern, string)

以列表形式列出给定模式的所有匹配项

 

re.sub(pat, repl, string[, count=0])

用给定的替换式(repl)替换字符串string中的与pat相匹配的匹配项,返回替换后的string。如:

1 pat = '{name}'
2 text = 'dear {name}'
3 print(re.sub(pat, 'Mr.Tan', text))

结果:

dear Mr.Tan

 

re.escape(string)

对字符串中所有可能被解释为正则运算符的字符进行转义,如:

1 pat = re.escape('www.(python)+.org')
2 print(pat)
3 text = 'www.python.org or www.pythonpython.org or www.(python)+.org will be replaced'
4 print(re.sub(pat, 'something', text))

结果:

www\.\(python\)\+\.org
www.python.org or www.pythonpython.org or something will be replaced

 

匹配对象和组:

match,split,findall等能对字符串进行模式匹配的函数在找到匹配项后都会返回MatchObject对象,这些对象也包含匹配模式中与子模式相对应的

子字符串的信息和组(group)信息

group([group1, ...])     获取给定子模式(组)的匹配项

start([group])              返回给定组的匹配项在字符串中的开始位置

end([group])               返回给定组的匹配项在字符串中的结束位置

span([group])             返回一个组的开始和结束位置

如:

1 m = re.match('www\.(.*)\.(.{3})', 'www.python.org')
2 print(m)
3 print(m.group(1), m.group(2))
4 print(m.start(1), m.end(1), m.span(1))

结果:

<_sre.SRE_Match object; span=(0, 14), match='www.python.org'>
python org
4 10 (4, 10)

re.sub()一个强大的功能:在替换内容(repl)中使用'\\n'表示repl中\\n处插入匹配项中第n组的子字符串!再用插入后的repl来替换匹配项!如:

1 emphasis_pat = r'\*([^\*]+)\*'
2 text = 'hello, *world*!'
3 print(re.sub(emphasis_pat, '<em>\\1</em>', text))

结果:

hello, <em>world</em>!

 

posted @ 2018-07-21 17:16  大黑耗  阅读(182)  评论(0编辑  收藏  举报