<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 正则表达式
1 基础部分
管道符号（|）匹配多个正则表达式
Step1:  2.3 search
match 从字符串开始位置进行匹配，但是模式出现在字符串的中间的位置比开始位置的概率大得多
Step2:  search 函数将返回字符串开始模式首次出现的位置
Step3:  2.4 匹配多个字符串
Step4:  2.5 匹配任意单个字符(.)
句点不能匹配换行符或者匹配非字符串（空字符串）
Step5:  2.6 创建字符集合([ ])
Step6:  2.7 分组
2.7.1匹配邮箱
Step7:  2.7.2 分组表示
Step8:  2.8 字符串开头或者单词边界
2.8.1  字符串开头或者结尾
Step9:  2.8.2 单词边界
Step10:  2.9 find 模块
Step11:  2.10 sub()和subn()函数
Step12:  2.11 split分割
Step13:  3 搜索和匹配的比较，“贪婪”匹配
Step14:  由于通配符“.”默认贪心的，所以'.+'将会匹配尽可能多的字符，所以
Thu Feb 15 17
<ASSISTANT_TASK:>
Python Code:
import re
m = re.match('foo', 'foo')
if m is not None: m.group()
m
m = re.match('foo', 'bar')
if m is not None: m.group()
re.match('foo', 'foo on the  table').group()
# raise attributeError
re.match('bar', 'foo on the  table').group()
Explanation: 正则表达式
1 基础部分
管道符号（|）匹配多个正则表达式:
at | home 匹配 at,home
匹配任意单一字符(.): 
t.o 匹配 tao,tzo
字符串和单词开始和结尾位置匹配：
（^） 匹配字符串开始位置：^From 匹配 From 开始的字符串
（\$） 匹配字符串结尾的位置： /bin/tsch\$ 匹配/bin/tsch结束的字符串
(\b) 匹配单词的边界：\bthe 匹配the开头的单词
(\B) 与\b 相反
([]) 创建匹配字符集合：b[aeiu]t 匹配 bat,bet,bit,but
(-) 指定范围匹配： [a-z]匹配a到z的字符
(^)否定：[^aeiou]匹配非元音
*： 出现一次；+： 出现1次和多次；？：出现1次和0次
\d: 匹配数字，\D: 相反；\w 整个字符数字的字符集，\W 相反；\s 空白字符，\S 相反。
(()):进行分组匹配
2 Re模块
2.1 常用函数
comple(pattern, flags=0) 
对正则表达式进行编译，返回regex对象
match(pattern, string, flags=0) 
尝试用一个正则表达式模式pattern对一个字符串进行匹配，如果匹配成功，返回匹配的对象  
search(pattern, string, flags=0) 
在字符串中搜索pattern的第一次出现
findall(pattern, string[,flags])和finditer(pattern, string[,flags]) 
返回字符串中模式所有的出现，返回分别为列表和迭代对象  
split(pattern, string, max=0) 
根据正则表达式将字符串分割成一个列表 
sub(pattern, repl, string, max=0)
把字符串的中符合pattern的部分用repl替换掉
group(num=0) 
返回全部匹配对象（或者指定编号是num的子组）
group()
包含全部数组的子组的字符串
2.2 match
End of explanation
m = re.match('foo','seafood')
if m is not None: m.group()
Explanation: 2.3 search
match 从字符串开始位置进行匹配，但是模式出现在字符串的中间的位置比开始位置的概率大得多
End of explanation
re.search('foo', 'seafood').group()
Explanation: search 函数将返回字符串开始模式首次出现的位置
End of explanation
bt = 'bat|bet|bit'
re.match(bt,'bat').group()
re.match(bt, 'blt').group()
re.match(bt, 'He bit me!').group()
re.search(bt, 'He bit me!').group()
Explanation: 2.4 匹配多个字符串
End of explanation
anyend='.end'
re.match(anyend, 'bend').group()
re.match(anyend, 'end').group()
re.search(anyend, '\nend').group()
Explanation: 2.5 匹配任意单个字符(.)
句点不能匹配换行符或者匹配非字符串（空字符串）
End of explanation
pattern = '[cr][23][dp][o2]'
re.match(pattern, 'c3po').group()
re.match(pattern, 'c3do').group()
re.match('r2d2|c3po', 'c2do').group()
re.match('r2d2|c3po', 'r2d2').group()
Explanation: 2.6 创建字符集合([ ])
End of explanation
patt = '\w+@(\w+\.)?\w+\.com'
re.match(patt, 'nobady@xxx.com').group()
re.match(patt, 'nobody@www.xxx.com').group()
# 匹配多个子域名
patt = '\w+@(\w+\.)*\w+\.com'
re.match(patt, 'nobody@www.xxx.yyy.zzz.com').group()
Explanation: 2.7 分组
2.7.1匹配邮箱
End of explanation
patt = '(\w\w\w)-(\d\d\d)'
m = re.match(patt, 'abc-123')
m.group()
m.group(1)
m.group(2)
m.groups()
m = re.match('ab', 'ab')
m.group()
m.groups()
m = re.match('(ab)','ab')
m.groups()
m.group(1)
m = re.match('(a(b))', 'ab')
m.group()
m.group(1)
m.group(2)
m.groups()
Explanation: 2.7.2 分组表示
End of explanation
re.match('^The', 'The end.').group()
# raise attributeError
re.match('^The', 'end. The').group()
Explanation: 2.8 字符串开头或者单词边界
2.8.1  字符串开头或者结尾
End of explanation
re.search(r'\bthe', 'bite the dog').group()
re.search(r'\bthe', 'bitethe dog').group()
re.search(r'\Bthe', 'bitthe dog').group()
Explanation: 2.8.2 单词边界
End of explanation
re.findall('car', 'car')
re.findall('car', 'scary')
re.findall('car', 'carry, the barcardi to the car')
Explanation: 2.9 find 模块
End of explanation
(re.sub('X', 'Mr. Smith', 'attn: X\n\nDear X, \n'))
print re.subn('X', 'Mr. Smith', 'attn: X\n\nDear X, \n')
re.sub('[ae]', 'X', 'abcdedf')
Explanation: 2.10 sub()和subn()函数
End of explanation
re.split(':','str1:str2:str3')
from os import popen
from re import split
f = popen('who', 'r')
for eachLine in f.readlines():
    print split('\s\s+|\t', eachLine.strip())
f.close()
Explanation: 2.11 split分割
End of explanation
string = 'Thu Feb 15 17:46:04 2007::gaufung@cumt.edu.cn::1171590364-6-8'
patt = '.+\d+-\d+-\d+'
re.match(patt, string).group()
patt = '.+(\d+-\d+-\d+)'
re.match(patt, string).group(1)
Explanation: 3 搜索和匹配的比较，“贪婪”匹配
End of explanation
patt = '.+?(\d+-\d+-\d+)'
re.match(patt, string).group(1)
Explanation: 由于通配符“.”默认贪心的，所以'.+'将会匹配尽可能多的字符，所以
Thu Feb 15 17:46:04 2007::gaufung@cumt.edu.cn::117159036  
将匹配'.+'，而分组匹配的内容则是“4-6-8”,非贪婪算法则通过'?'解决
End of explanation
<END_TASK>