1. 正则表达式—特殊表达式含义

1.1 普通字符集

1)    \w                匹配字母数字及下划线
2) \W    匹配非字母数字及下划线
3) \s   匹配任意空白字符,等价于 [\t\n\r\f].
4) \S   匹配任意非空白字符
5) \d   匹配任意数字,等价于 [0-9]
6) \D    匹配任意非数字
7) \1...\9   匹配第n个分组的内容。
8) [a-zA-Z0-9]

1.2 数量字符集

用在字符或分组符(…)之后,默认贪婪匹配,如果想抑制贪婪匹配,需在数量字符后加?,例如:\w+?

1) .      匹配任意字符,除了换行符,当re.DOTALL标记被指定时,可以匹配包括换行符的任意字符
2) * 匹配前一个字符0次1次或多次
3) + 匹配前一个字符1次或多次
4) ? 匹配前一个字符0次或1次
5) {m} 匹配前一个字符m次
6) {m,n} 匹配前一个字符m到n次
7) {m,} 匹配前一个字符至少m次
8) {,n}

1.3 边界匹配符

1)  ^      匹配字符串开头,如果是多行则匹配每一行的开头
2) [^]      [...]中,^表示否定,如非字母[^a-zA-Z],非数字[^0-9]
3) $       匹配字符串或一行的结尾,如果是多行匹配模式,则每一行的结尾
4) \A      仅匹配字符串的开始,同^
5) \b      匹配一个单词的边界,也就是指单词和空格间的位置
6) \B      等价于[^\b]表示匹配非单词边界
7) \Z      匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
8)

1.4 逻辑匹配符

1)  |(或)
    匹配 | 左右任意一种正则表达式,如果左边表达式匹配上,匹配结束,不再匹配右边的正则表达式,该符号一般放在()中使用,如果没在圆括号中则它的范围是整个正则表达式
2) 分组 (...)
    后向引用,用()括起来的正则表达式将被作为一个分组,从正则表达式的左边依次算起,有多少个左括号'(',就有 多少个分组,分组的编码从1依次加1,无论是括号中嵌套括号,并且分组表达式作为一个整体,后可接数量词。
3) \<number>
    引用分组匹配到的分组编号为<number>的字符串 如:\1...\9
4) (?P<name>...)
    命名分组,除了默认的分组编号外再指定一个别名分组
    注意:P是大写
5) (?P=name)
    引用别名为name的分组匹配,这个是在正则表达式中引用,表示匹配重复的字符串,也可以使用编号引用。
    注意:P是大写

1.5 特殊匹配符

1)  (?imx)        正则表达式包含三种可选标志:i, m,  x 。只影响括号中的区域。
2) (?-imx)     正则表达式关闭 i, m, x 可选标志。只影响括号中的区域。
3) (?:...)    匹配到的括号内字符串不作为分组
4) (?!pattern) 前向否定断言语法,表示否定开头, 只能用在正则表达式的开头,pattern是匹配模式,它后面的内容需要不匹配 该正则表达式才匹配成功
5) (?<!pattern)   后向否定断言语法,表示否定结尾,前面的内容需要不匹配该pattern模式才匹配成功
6) (?=pattern)   前向肯定断言语法. 需要匹配pattren模式才能匹配成功,表示肯定前面的字符内容
7) (?<=pattern) 后向肯定断言语法, 需要匹配pattern模式才能匹配成功,表示肯定后面的字符内容
8) (?#...)    后面的内容将被作为注释而忽略

2. 例子

# coding=utf-8
import re
# 1. 写一个正则表达式,使其能同时识别下面所有的字符串:'bat','bit', 'but', 'hat', 'hit', 'hut'

s ="bat ,bit ,but ,hat ,hit ,hut"
print re.findall(r'[bh][aiu]t',s)

# 2.匹配由单个空格分隔的任意单词对,也就是姓和名

s = "Han meimei, Li lei, Zhan san, Li si"
print re.findall(r'([A-Za-z]+) ([A-Za-z]+)',s)

# 3. 匹配由单个逗号和单个空白符分隔的任何单词和单个字母,如姓氏的首字母

s = "yu, Guan bei, Liu fei, Zhang"
print re.findall(r'([a-zA-Z]+),\s([a-zA-Z])',s)

# 4.匹配所有的有效的Python标识符集合

s = "_hello , python_1 , 2world , Pra_ni , @dfa_ , ewq* "
print re.findall(r'\b[a-zA-z_][\w]*(?!=\W) ',s)

# 5. 根据美国街道地址格式,匹配街道地址。美国接到地址使用如下格式:1180 Bordeaux Drive。使你的正则表达式足够灵活,以支持多单词的街道名称,如3120 De la Cruz Boulevard

s = """street 1: 1180 Bordeaux Drive,"
street 1: 3120 De la Cruz Boulevard"""
print re.search(r'\d+( +[a-zA-Z]+)+',s).group()

# 6. 匹配以“www”起始且以“.com”结尾的简单Web域名:例如,http://www.yahoo.com ,也支持其他域名,如.edu .net等

s = "http://www.yahoo.com www.foothill.edu"
print re.search(r'w{3}\.[a-zA-Z]+\.(com|edu|net)',s).group()

# 7. 匹配所有能够表示Python整数的字符串集

s = '520a1 20L 0 156 -8 -10a A58'
ite = re.finditer(r'-?\d+',s)
for i in ite: print i.group(),

# 8. 匹配所有能够表示Python长整数的字符串集

s = '520a 20L 0 156 -8L A58'
ite = re.finditer(r'-?\d+L',s)
for i in ite: print i.group(),

# 9. 匹配所有能够表示Python浮点数的字符串集

s = '80.2 fds2.1 0.003'
print re.findall(r'\d+\.\d+',s)

# 10. 表示所有能够表示Python复数的字符串集

s = '12j fds -4j 5-2j fdsa'
print re.findall(r'\d*-?\d+j',s)

# 11、匹配一行文字中的所有开头的字母内容

s="Now, let's take a closer look at some iconic moments from the show's stage made by Chinese Angels."
print re.findall(r'\b\w',s)

# 12、匹配一行文字中的所有开头的数字内容

s="Now, let's take a closer look at some iconic moments from the show's stage made by Chinese Angels."
print re.findall(r'\b\d',s)

# 13、匹配一行文字中的所有开头的数字内容或字母内容

s = "577fsda3f you12daf f1s32dafffff"
print re.findall(r'\b\d+|\b[A-Za-z]+',s)

# 14、 只匹配包含字母和数字的行

s = "nihao fsadf \n789! 3asfd 1\nfds12df e4 4564"
print re.findall(r'^([a-zA-Z\d ]+)$',s,re.M)

# 15、提取每行中完整的年月日和时间字段

s="""time 1988-01-01 17:20:10 fsadf 2018-02-02 02:29:01"""
print re.findall(r'[12]\d{3}\-[01]\d\-[0123]\d\s*[012]\d\:[012345]\d\:[012345]\d',s)

# 16、将每行中的电子邮件地址替换为你自己的电子邮件地址

s="""xss@qq.com, 465465@163.com, ppp@sina.com
s121f@139.com, soifsdfj@134.com
pfsadir423@123.com"""
print re.sub(r'\w+?\@\w+?\.com','zeke@qq.com',s)

# 17、匹配\home关键字:

s ="fdsar \home \homeer"
print re.findall(r'\\home',s)