匹配ip地址
参考 http://blog.chinaunix.net/uid-108431-id-3350731.html
http://blog.csdn.net/liangyuannao/article/details/8755325
第一步:地址分析,正则初判
- 1、0-9 \d 进行匹配
- 2、10-99 [1-9]\d 进行匹配
- 2、100-199 1\d\d 进行匹配
- 3、200-249 2[0-4]\d 进行匹配
- 4、250-255 25[0-5] 进行匹配
- 基本表达式可以合并为: \d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]
- 前三部分正则表达式合并为: ((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}
- 前三部分加上最后一部分合并为:((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])
第三步:进一步合并
可以进一步合并为:
r = r'((([1-9]?|1\d)\d|2([0-4]\d|5[0-5]))\.){3}(([1-9]?|1\d)\d|2([0-4]\d|5[0-5]))'
经过测试发现ip地址带有别的字符串过滤会有问题
经改后为
r='((?:(?:(?:[1-9]?|1\d)\d|2(?:[0-4]\d|5[0-5]))\.){3}(?:[2-9]|(?:[1-9]|1\d)\d|2(?:[0-4]\d|5[0-4])))\D'
re.findall(r,s)
注意:
- 该正则表达式有两个缺陷:
- 0.0.0.0不能判断
- 255.255.255.255不能正确判断
- 这个问题需要使用其他代码进行辅助解决
内建函数,
abs()取绝对值 max()min()
divmod(x,y) 返回求模后的商和余数 callable(函数)判断函数是否可被调用
isinstance(x,y)判断类型
str.capitalize() 字符串首字母大写
str.replace() 字符串替换 这个是具体替换,模糊替换查看sub()
string.replace(s,old,new)需要导入string模块
filter(函数,序列)函数作用于序列,可用于序列过滤
正则表达
r1 = r"\d{3,4}-?"
编译正则表达为对象
re_tel=re.compile(r1)
这样就可以当做对象进行调用re的方法
re_tel.findall('字符串')返回列表
匹配不区分大小写
re_tel=re.compile(r1,re.I)re.I 调用re的属性表示不区分大小写
match()匹配的对象是否在字符串的开始位置,返回一个对象,一般可以把返回值给一个变量,看这个变量是否为none,
search() 匹配字符串无论在任何位置,也是返回对象
finditer() 匹配后返回一个对象可迭代器,可以通过next()方法查看,其返回也是一个对象,若果想看到其值,就可以掉用方法group()
类似于group()的方法还有
start() 返回匹配开始的的位置
end 返回匹配结束的位置
span 返回一个元祖,包含(开始,结束)
sub是截取字符串,但是支持多个分隔符
sub(正则,'替换对象',原始字符串) 这个是模糊替换
re.split(正则,字符串)支持多个分隔符,且支持正则表达
r1=r"[\+\-\*]"
re.split(r1,s)以+,_,*,三个字符串作为分隔符
正则表达里面经常用到的属性
re.S 使 . 匹配包含换行在内的所有字符 re.findall(r1,字符串,re.S)
re.I 使匹配不区分大小写
re.M 多行匹配,影响^ 和$,同时多行的匹配,如果正则表达式是多行的话,也要加这个属性
re.X能够使用REs的verbose状态是指被组织的更清晰易懂
正则表达式分组
email = r "\w{3}@\w+(\.com|\.cn)"
re.match(email,'[email protected]') 匹配到了会返回一个对象
re.findall(email,[email protected]) 返回的是匹配到的分组字符串[.com]
如果我们有一个字符串s=''' sdf hello sun=westos t43
wefs sun=no t43 sdf
hello sun=ni t43 sddsf'''
r1=r"hello sun=.+ t43"
re.findall(r1,s) 返回的匹配到的所有数据 ['hello sun=westos t43','hello sun=ni t43']
如果我们做分组处理
r1=r"hello sun=(.+) t43"
re.findall(r1,s) 返回的优先是分组中的数据,就是匹配到分组的数据 ['westos','ni']
match也可以匹配
这个可以用到网络的爬虫,获取我们想获取的url或者ip