正则表达式(re=regular expression)
通配符
1. .表示当前目录
2. ..表示目录的上级目录
3. *表示0个或者多个字符
4. ?一个任意字符
5. [[:digit:]] 表示匹配数字
6. [[:space:]] 表示匹配空格
特殊的符号
一个完整的正则使用过程
#!/usr/bin/env python
# coding:utf-8
import re
a = re.match(r"westos","westoshi")
print a.group()
#match 是从左往右依次匹配的
print re.match(r"hello","westoshello")
\d 表示单个数字
\D为\d的取反,表示除了数字之外
#!/usr/bin/env python
# coding:utf-8
import re
a = re.match(r"\d","6")
print a.group()
b = re.match(r"\D","g6")
print b.group()
\S,\s的取反,表示除了空格之外
#!/usr/bin/env python
# coding:utf-8
import re
a = re.match(r"\s"," 11")
print a.group()
b = re.match(r"\S","a11")
#!/usr/bin/env python
# coding:utf-8
import re
a = re.match(r"\w","a11")
print a.group()
b = re.match(r"\w","_11")
print b.group()
c = re.match(r"\w","12")
print c.group()
* 匹配前的一个字符出现0次或者无限次,即可有可无
+ 匹配前的一个字符出现1次或者无限次,即至少出现一次
? 匹配前的一个字符出现1次或者0次
{m} 匹配前的字符出现m次
{m,} 匹配前的字符至少出现m次
{m,n} 匹配前的字符出现m次到n次
#!/usr/bin/env python
# coding:utf-8
import re
a = re.match(r"a*","hilele")
print a.group()
#!/usr/bin/env python
# coding:utf-8
import re
a = re.match(r"a+","aaaahilele")
print a.group()
应用一:匹配电话号码
#!/usr/bin/env python
# coding:utf-8
import re
reg = r"010-?\d{8}$" #正则规则,以010开头,-可有可无,010后为八个数字
phones = ["101-12345678","01012345678","010123456789"]
for i in phones:
a = re.match(reg,i)
if a:
print "%s 合法" %(i)
else:
print "%s 不合法" %(i)
应用2:匹配字符串
匹配出的字符串第一个字母为大写,后面为小写字母,且可有可无
#!/usr/bin/env python
# coding:utf-8
import re
reg = r"[A-Z][a-z]?"
s = ["Hi","A","huba"]
for i in s:
a = re.match(reg,i)
if a:
print "%s 合法" %(i)
else:
print "%s 不合法" %(i)
表示边界
1.^表示以啥开头
2.$表示以啥结尾
应用三:匹配QQ邮箱
1.找出列表中符合条件的邮箱地址,并储存到/tmp/mail.txt文件中
2.QQ邮箱地址以@qq.com结尾
3.@qq.com前内容以下划线,字母或者数字结尾,至少4位最多20位
#!/usr/bin/env python
# coding:utf-8
import re
reg = r"\w{4,20}.@qq.com$"
s = ["bb@qq.com","a@qq.com","_huba@qq.com","_1aaa@qq.com"]
for i in s:
a = re.match(reg,i)
if a:
print "%s 合法" %(i)
with open("/tmp/mail.txt",'a+') as f:
f.write(i+"\n")
else:
print "%s 不合法" %(i)
表示分组
1.|表示匹配|左右任意一个表达式即可
2.(ad) 表示将括号中的字符作为一个分组
3.\num 表示引用分组的第num 个匹配道德字符串
4.(?P) 分组起别名
5.(?P=name) 引用分组的别名
应用4:匹配出0-100之间的数字,包括1和100
#!/usr/bin/env python
# coding:utf-8
import re
reg = r"^0$|^100$|[1-9]\d?$"
a = re.match(reg,"100")
print a.group()
#!/usr/bin/env python
# coding:utf-8
import re
s = "http://www.westos.org/hrdao/book/hru/lihu"
reg = r"http://.+/(?P<first_connect>\w+)/(?P<second_connect>\w+)"
a = re.match(reg,s)
print a.group()
print a.groups()
print a.groupdict()
re 的高级用法
1.search()方法:只找到符合条件的第一个并返回
2.findall()方法:返回符合条件的所有内容(列表方式)
3.sub()方法:对符合正则的内容进行替换
4.spilt()方法:制定多个分隔符进行分隔
python贪婪和非贪婪
1.非贪婪模式,总是匹配尽可能少的字符
2.*,?,+,{m,n}后面加上?,使得贪婪模式变成非贪婪模式
#!/usr/bin/env python
# coding:utf-8
import re
s ="日历 111-4-24-23"
reg = r".+(\d+-\d+-\d+-\d)" #默认情况下为贪婪模式
a = re.search(reg,s)
print a.group(1)
JSON
#!/usr/bin/env python
# coding:utf-8
import json
dic = {
"service":"ftp",
"port":"22",
"service":"http",
"port":"80"
}
in_json = json.dumps(dic,indent = 4)
print in_json
print type(in_json)
out_json = json.loads(in_json)
print out_json
通配符
1. .表示当前目录
2. ..表示目录的上级目录
3. *表示0个或者多个字符
4. ?一个任意字符
5. [[:digit:]] 表示匹配数字
6. [[:space:]] 表示匹配空格
特殊的符号
一个完整的正则使用过程
#!/usr/bin/env python
# coding:utf-8
import re
a = re.match(r"westos","westoshi")
print a.group()
#match 是从左往右依次匹配的
print a
print re.match(r"hello","westoshello")
\d 表示单个数字
\D为\d的取反,表示除了数字之外
#!/usr/bin/env python
# coding:utf-8
import re
a = re.match(r"\d","6")
print a.group()
b = re.match(r"\D","g6")
print b.group()
\S,\s的取反,表示除了空格之外
#!/usr/bin/env python
# coding:utf-8
import re
a = re.match(r"\s"," 11")
print a.group()
b = re.match(r"\S","a11")
print b.group()
\w 表示匹配字母,数字或者下划线#!/usr/bin/env python
# coding:utf-8
import re
a = re.match(r"\w","a11")
print a.group()
b = re.match(r"\w","_11")
print b.group()
c = re.match(r"\w","12")
print c.group()
* 匹配前的一个字符出现0次或者无限次,即可有可无
+ 匹配前的一个字符出现1次或者无限次,即至少出现一次
? 匹配前的一个字符出现1次或者0次
{m} 匹配前的字符出现m次
{m,} 匹配前的字符至少出现m次
{m,n} 匹配前的字符出现m次到n次
#!/usr/bin/env python
# coding:utf-8
import re
a = re.match(r"a*","hilele")
print a.group()
#!/usr/bin/env python
# coding:utf-8
import re
a = re.match(r"a+","aaaahilele")
print a.group()
应用一:匹配电话号码
#!/usr/bin/env python
# coding:utf-8
import re
reg = r"010-?\d{8}$" #正则规则,以010开头,-可有可无,010后为八个数字
phones = ["101-12345678","01012345678","010123456789"]
for i in phones:
a = re.match(reg,i)
if a:
print "%s 合法" %(i)
else:
print "%s 不合法" %(i)
应用2:匹配字符串
匹配出的字符串第一个字母为大写,后面为小写字母,且可有可无
#!/usr/bin/env python
# coding:utf-8
import re
reg = r"[A-Z][a-z]?"
s = ["Hi","A","huba"]
for i in s:
a = re.match(reg,i)
if a:
print "%s 合法" %(i)
else:
print "%s 不合法" %(i)
表示边界
1.^表示以啥开头
2.$表示以啥结尾
应用三:匹配QQ邮箱
1.找出列表中符合条件的邮箱地址,并储存到/tmp/mail.txt文件中
2.QQ邮箱地址以@qq.com结尾
3.@qq.com前内容以下划线,字母或者数字结尾,至少4位最多20位
#!/usr/bin/env python
# coding:utf-8
import re
reg = r"\w{4,20}.@qq.com$"
s = ["bb@qq.com","a@qq.com","_huba@qq.com","_1aaa@qq.com"]
for i in s:
a = re.match(reg,i)
if a:
print "%s 合法" %(i)
with open("/tmp/mail.txt",'a+') as f:
f.write(i+"\n")
else:
print "%s 不合法" %(i)
表示分组
1.|表示匹配|左右任意一个表达式即可
2.(ad) 表示将括号中的字符作为一个分组
3.\num 表示引用分组的第num 个匹配道德字符串
4.(?P) 分组起别名
5.(?P=name) 引用分组的别名
应用4:匹配出0-100之间的数字,包括1和100
#!/usr/bin/env python
# coding:utf-8
import re
reg = r"^0$|^100$|[1-9]\d?$"
a = re.match(reg,"100")
print a.group()
#!/usr/bin/env python
# coding:utf-8
import re
s = "http://www.westos.org/hrdao/book/hru/lihu"
reg = r"http://.+/(?P<first_connect>\w+)/(?P<second_connect>\w+)"
a = re.match(reg,s)
print a.group()
print a.groups()
print a.groupdict()
re 的高级用法
1.search()方法:只找到符合条件的第一个并返回
2.findall()方法:返回符合条件的所有内容(列表方式)
3.sub()方法:对符合正则的内容进行替换
4.spilt()方法:制定多个分隔符进行分隔
python贪婪和非贪婪
1.非贪婪模式,总是匹配尽可能少的字符
2.*,?,+,{m,n}后面加上?,使得贪婪模式变成非贪婪模式
#!/usr/bin/env python
# coding:utf-8
import re
s ="日历 111-4-24-23"
reg = r".+(\d+-\d+-\d+-\d)" #默认情况下为贪婪模式
a = re.search(reg,s)
print a.group(1)
非贪婪模式:
JSON
#!/usr/bin/env python
# coding:utf-8
import json
dic = {
"service":"ftp",
"port":"22",
"service":"http",
"port":"80"
}
in_json = json.dumps(dic,indent = 4)
print in_json
print type(in_json)
out_json = json.loads(in_json)
print out_json
print type(out_json)