概念
通配符 .
对特殊字符进行转义 'python\\.org' r'python\.org'
字符集 [a-z0-9]python [^abc].ython
选择符和子模式 p(ython|erl)
可选 项和重复子模式 r'http://'?(www\.)?python\.org' ,r'w{3,4}\.python\.org'
字符的开始与结尾 r'^http.lifei.com$'
元字符
| 代码 |
说明 |
| . |
匹配除换行符以外的任意字符 |
| \w |
匹配字母或数据或下划线或汉字 |
| \s |
匹配任意的空白符 |
| \d |
匹配数字 |
| \b |
匹配单词的开始或结束 |
| ^ |
匹配字符串的开始 |
| $ |
匹配字符串的结束 |
常用限定符
| 代码/语法 |
说明 |
| * |
重复零次或更多次 |
| + |
重复一次或更多次 |
| n |
重复n次 |
| n, |
重复n次或更多次 |
| n,m |
重复n到m次 |
re模块的内容
| 函数 |
描述 |
| compile(pattern[,flags]) |
根据包含正则表达式的字符串创建模式对像 |
| search(pattern,string[,flags]) |
在字符串中寻找模式 |
| match(pattern,string[,flags]) |
在字符串的开始处匹配模式 |
| split(pattern,string[,maxsplit=0]) |
根据模式的匹配项来分割字符串 |
| findall(pattern,string) |
列出字符串中模式的所有匹配项,以列表的形式存在 |
|
finditer(pattern, string, flags=0)在输入字符串中找到所有匹配内容,如果匹配成功,则返回可迭代的对象 |
| sub(pat,repl,string[,count=0]) |
将字符串中所有pat的切尔西项用repl替换 |
| escap(string) |
将字符串中所有特殊正则表达式字符转义 |
>>> import re
>>> aa=re.escape('python.com')
>>> aa
'python\\.com'
>>> pattern=r'[pj]ython\.com'
>>> some_test='this is python test'
>>> re.search(pattern,some_test)
>>> some_test='this is python.com test'
>>> re.search(pattern,some_test)
<_sre.SRE_Match object at 0x10cde9a58>
>>> re_pattern=re.compile(pattern)
>>> re_pattern.search(some_test)
<_sre.SRE_Match object at 0x10cde9ac0>
>>> re_pattern.findall(some_test)
['python.com']
>>> some_test
'this is python.com test'
>>> re_pattern.sub('java.com',some_test)
'this is java.com test'
>>> pattern=re.compile('lifei')
>>> pattern.sub('ok','lifei lifei lifei')
'ok ok ok'
>>> pattern.sub('ok','lifei lifei lifei',count=2)
'ok ok lifei'
>>> pattern.sub('ok','lifei lifei lifei',count=1)
'ok lifei lifei'
>>>
>>> some_test='alpha,beta,,,, gamma; delta'
>>> re.split(',',some_test)
['alpha', 'beta', '', '', '', ' gamma; delta']
>>> re.split('[,]+',some_test)
['alpha', 'beta', ' gamma; delta']
>>> re.split('[,;]+',some_test)
['alpha', 'beta', ' gamma', ' delta']
>>> some_test='alpha,beta,,;,, gamma,; delta'
>>> re.split('[,;]+',some_test)
['alpha', 'beta', ' gamma', ' delta']
>>> re.split('[,;]+',some_test,maxsplit=2)
['alpha', 'beta', ' gamma,; delta']
>>> some_test
'alpha,beta,,;,, gamma,; delta'
>>> re.split('[,;]+',some_test,maxsplit=1)
['alpha', 'beta,,;,, gamma,; delta']
re匹配对象的重要方法
| 方法 |
描述 |
| group([group1, ,,,]) |
获取给定子模式(组)的匹配项 |
| start([group]) |
返回给定组的匹配项的开始位置 |
| end(group[]) |
返回给定组匹配项的结束位置(和分片一样,不饮食组的结束位置) |
| span([group]) |
返回一个组的开始和结束位置 |
>>> m=re.match(r'www\.([a-z]+)\.([a-z]+)','www.python.org')
>>> m.group(0)
'www.python.org'
>>> m.group(1)
'python'
>>> m.group(2)
'org'
>>> m.start(1)
4
>>> m.end(1)
10
>>> m.span(1)
(4, 10)
>>> re.sub(r'www\.([a-z]+)\.([a-z]+)',r'<em>\1</em>','www.python.org')
'<em>python</em>'
>>> re.sub(r'www\.([a-z]+)\.([a-z]+)',r'<em>\2</em>','hello,www.python.org')
'hello,<em>org</em>'
>>> re.sub(r'www\.([a-z]+)\.([a-z]+)',r'<em>\1</em>','hello,www.python.org')
'hello,<em>python</em>'
# 贪婪和非贪婪模式
>>> re.sub(r'\*(.+)\*',r'<em>\1</em>','*this*is*a*dog*')
'<em>this*is*a*dog</em>'
>>> re.sub(r'\*(.+?)\*',r'<em>\1</em>','*this*is*a*dog*')
'<em>this</em>is<em>a</em>dog*'
cat templates.py
import fileinput,re
field_pat=re.compile(r'\[(.+?)\]')
scope={}
def replace(match):
code=match.group(1)
try:
return str(eval(code,scope))
except SyntaxError:
exec code in scope
return ''
lines=[]
for line in fileinput.input():
lines.append(line)
text=''.join(lines)
print field_pat.sub(replace,text)
~ > cat aa.txt
[x=2]
[y=3]
The sum of [x] and [y] is [x+y]
python templates.py aa.txt
The sum of 2 and 3 is 5
让正则表达式变得更加易读的方式是在re函数中使用VERBOSE标志。它允许在模式中添加空白(空白字符、tab、换行符,等等)。re则会忽略它们,除非将其放在字符串类或者用反斜线转义。
emphasix_pattern=re.compile(r''' #haha
\* #Begining emphasis tag -- an asterisk
( # Begin group for capturing phrase
[^\*] #Capture anything except asterisks
) # End group
\* # End emphasis tag
''',re.VERBOSE)
等价于
emphasix_pattern=re.compile(r'''*([^*])*'''