Python 3.6 正则表达式二 包含筛选IP正则表达式

# -----------------------
# __Author : tyran
# __Date : 17-11-2
# -----------------------

"""
正则表达式
"""

import re

# 1. '[]' 字符集 其实就是或的关系,允许字符集内任意一个字符
ret = re.findall('a[cd]x', '***adx***')
print(ret)  # ['adx']

ret = re.findall('a[cd]x', '***acx***')
print(ret)  # ['acx']

# 匹配a-z
ret = re.findall('[a-z]', 'ac@@z')
print(ret)  # ['a', 'c', 'z']

# 取消元字符的特殊功能 '^','-','\'例外
ret = re.findall('abc[.]cn', 'abc.cn')
print(ret)

# 取反
ret = re.findall('[^abc]', 'eabcd')
print(ret)  # ['e', 'd']

ret = re.findall('[^4,5]', '12345')  # 取反的是[]内所有值
print(ret)  # ['1', '2', '3']

# 2. '\' 去除元字符特殊功能或者实现部分普通字符的特殊功能
ret = re.findall('\d', 'aaa123bbb')  # 匹配所有十进制数字
print(ret)  # ['1', '2', '3']

ret = re.findall('\d{11}', 'aaa13411012099bbb13012033344')
print(ret)  # ['13411012099', '13012033344']

ret = re.findall('\D', 'aaa123bbb')  # 匹配所有非十进制数字
print(ret)  # ['a', 'a', 'a', 'b', 'b', 'b']

# 匹配任意空白字符 \t \n \r \f \v这些都是
ret = re.findall('\saaa', ' ** \t\naaa')
print(ret)  # ['\naaa']

# 匹配任意非空白字符
ret = re.findall('\Saaa', ' aaa** \t\naaa baaa')
print(ret)  # ['baaa']

# 匹配任意数字字母字符
ret = re.findall('\w{3}a', 'abca,123a, a1a,1e3a')
print(ret)  # ['abca', '123a', '1e3a']

# 匹配任意非数字非字母字符
ret = re.findall('\W', 'abc@123$a1w%1e3')
print(ret)  # ['@', '$', '%']

# 匹配一个特殊边界
ret = re.findall('I\b', 'I am a LIST')
print(ret)  # []
# 怎么会没有呢 因为\b在Python里也有转义,退格符
ret = re.findall(r'I\b', 'I am a LIST')
print(ret)  # ['I']
# 字符串之前加个r就可以防止被Python转义,正则表达式有自己的语法规则,两个\b不是一个意思哈

"""
----------------------------------------------------------------------------
"""
# search方法 匹配出满足条件的第一个结果 返回的是一个对象
ret = re.search('a.b', 'aabaac').group()
print(ret)  # aab

ret = re.search('aaa', "aaaaaaa")
print(ret.group())
# 如果没有匹配到返回的None(去除元字符意义)
print(re.search('a\.b', 'aaacbaac'))  # None

# 两个\是一个特殊的用法,由于在Python解释器里'\'也是有转义的意思,所以'\\\\'前两个是给Python看的,
# 然而正则表达式的语法里,对于'\'也是有语法规则(去除特殊意义),那如果要用\去除\的特殊意义,也需要两个\
# 加起来就变成4个了,所以以后记得不要转义的话,字符串前加r
ret = re.search('\\\\', 'abcD\de').group()
print(ret)  # \

ret = re.search(r'\\', 'abcD\de').group()
print(ret)  # \

ret = re.search('\\babc', 'abcbcc').group()
print(ret)  # abc

"""
-----------------------------------------------------------------------------
"""

# 4. '()'分组 和 '|'或

ret = re.search('a(bc)+', 'abcbc').group()
print(ret)  # abcbc

# ?P<id> 这个id就是分组的名字,可以通过返回的对象,取不同的内容
ret = re.search('www\.(?P<name>\w+)\.(com|cn)', 'eeewww.ThisIsATest.cnxxxxwww.ccc.com')
print(ret.group('name'))  # ThisIsATest

# IP地址正则匹配,不允许第一段为0,最后一段可以0-255,0代表网段,255虽然客户端不能使用,但是这个地址试有用的
# 最后一段的顺序是有讲究的,越小的集合放在越前面,因为最有没有'.'作为分割了
ret = re.search(
    '(([1-9])|(1\d\d?)|(2[0-4]?\d)|(25[0-5]))\.'    #IP第一段 1-255
    '(((1?\d?\d)|(2[0-4]?\d)|(25[0-5]))\.){2}'      #第二第三段 0-255 
    '((25[0-5])|(2[0-4]\d)|(1?\d?\d))',             #第四段 0-255 
    'ipaddr:232.2.5.253').group()
print(ret)

"""
--------------------------------------------------------------------------------------------
"""
"""
re常用方法

1.findall() : 返回所有结果到一个列表
2.search() : 返回一个对象,可以通过调用对象的group()方法获取返回值
3.match() : 从字符串头部开始匹配,返回一个对象,可以通过调用对象的group()方法获取返回值
"""
# 4.split 这个举个例子
# 他这个分割会先按照';'去分割--->['aaa,111', 'bbb,222']
# 然后再按照','去分割每一个元素
# 其实我测试了一下,这个先后关系没有发现什么实际意义,通过源码的注释,我也没有发现什么,我觉得理解成 或 也没什么问题
ret = re.split('[;,]', 'aaa,111;bbb,222')
print(ret)  # ['aaa', '111', 'bbb', '222']

# 5.sub 替换方法 第一个参数:目标字符串  第二个参数:被替换成什么字符串  第三个参数:源字符串
ret = re.sub('a..', 'bbb', '**aac*abbcc')
print(ret)  # **bbb*bbbcc

# 6.compile 创建一个带有规则的re对象
cmp = re.compile('\.com')
print(cmp.search("aabbcc.com").group())  # .com
print(cmp.sub('.cn', 'aabbcc.com'))  # aabbcc.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值