python学习2正则表达

匹配ip地址

参考 http://blog.chinaunix.net/uid-108431-id-3350731.html

http://blog.csdn.net/liangyuannao/article/details/8755325

第一步:地址分析,正则初判 

  1. 1、0-9 \d 进行匹配
  2. 2、10-99 [1-9]\d 进行匹配
  3. 2、100-199 1\d\d 进行匹配
  4. 3、200-249 2[0-4]\d 进行匹配
  5. 4、250-255 25[0-5] 进行匹配
  1. 基本表达式可以合并为:       \d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]
  2. 前三部分正则表达式合并为:   ((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}
  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)

注意:

  1. 该正则表达式有两个缺陷:
  2. 0.0.0.0不能判断
  3. 255.255.255.255不能正确判断
  4. 这个问题需要使用其他代码进行辅助解决

内建函数,

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                          

猜你喜欢

转载自my.oschina.net/u/1775013/blog/760119