正则表达式的使用
compile 方法
编译正则表达式:
如果定义的一个正则表达式使用比较频繁的话,可以把该正则表达式编译一下,让它成为一个对象,然后使用,这样可以提高查找速度。
编译使用的是re中的compile()方法。 help(re.compile) compile(pattern, flags=0) re模块中更多的方法可以查看手册 ,help(re) 或 dir(re)
例:
import re
>>> r2 = r'\d{3,4}-?\d{8}'
>>> re.findall(r2,'1234-1345321')
[ ]
>>> re.findall(r2,'1234-13453212')
['1234-13453212']
>>> re.findall(r2,'123-13453212')
['123-13453212']
>>> re.findall(r2,'123-13456456')
['123-13456456']
>>> by = re.compile(r2) #使用compile方法把正则r2编译成一个对象
>>> by
<_sre.SRE_Pattern object at 0xb758b180>
>>> by.findall('2131-12345678') #直接使用by做匹配
['2131-12345678']……………………………………………………………………………………………………
db= re.compile( r'abcd',re.I ) #I 是compile中的一个属性,表示不区分大小写
>>> db.findall('Abcd')
['Abcd']
>>> db.findall('aBCd')
['aBCd']
>>> db.findall('aBcd')
['aBcd']
>>> db.findall('aBcD')
['aBcD']
>>>
########################
match 方法: 在match 中有四个属性
>>> db= re.compile('abcd',re.I) 编译一个正则 1.group()返回re查找到的字符串
>>> db.match('abc') 2.start() 返回匹配开始的位置
>>> db.match('abcd') 3.end() 返回匹配结束的位置
<_sre.SRE_Match object at 0xb7406de8> 表示是一个match对象 4.span() 以元组的形式返回开始和结束的位置
>>> a=db.match('abcd')
>>> a
<_sre.SRE_Match object at 0xb7413790>
>>> a.group() 可以查看到匹配到的值
'abcd'
>>> db.match('ad abcd') 如果需要匹配的字符串在开头,才会匹配成功,否则返回一个空值
search方法 在所有字符串中做查找
>>>db.search('ad abcd') search() 扫描字符串,不管字符串在哪个位置都可以匹配
<_sre.SRE_Match object at 0xb74fd100>
findall 方法 将所有能匹配的值以列表的形式全部返回
>>> db.findall('adc ab abcd')
['abcd']
>>> db.findall('adc ab abcd 134 abcd 34234 abcd')
['abcd', 'abcd', 'abcd']
finditer 方法 返回一个迭代的对象
>>> db.finditer('adc ab abcd 134 abcd 34234 abcd')
<callable-iterator object at 0xb73ea6ec>
>>> a = db.finditer('adc ab abcd 134 abcd 34234 abcd')
>>> a
<callable-iterator object at 0xb74f16cc>
>>> a.next()
<_sre.SRE_Match object at 0xb7406de8> 这里又成match对象
>>> a
<callable-iterator object at 0xb74f16cc>
######################################
sub 方法
用于将按正则替换字符串中的内容
sub(pattern, repl, string, count=0, flags=0)
例子:
>>> g='xiong chu mo'
>>> g.replace('xiong','ren')使用字符串处理方法replace将xiong替换成ren
'ren chu mo'
>>> gg = r'x...g' 定义一个正则
>>> g
'xiong chu mo'
>>> g.replace(gg,'sha')
'xiong chu mo' 显示无法替换
>>> re.sub(gg, 'fei', 'xabcg xaaag xcccg xxxxg aaa')
'fei fei fei fei aaa' 将字符串xabcg xaaag xcccg xxxxg 中的所有符合gg规则的字符串全部替换
split()方法:
作用:将按自己的需求切割字符串,默认以空格分割
注: 切割的标记字符串必须是该字符串中的字符。
sub(pattern, repl, string, count=0, flags=0)
>>> ip = '1.1.1.1' 注:ip此时是个字符串
>>> ip.split('x')
['1.1.1.1'] 切割字符串后的结果是个列表
>>> ip.split('.') 对该列表按'.'进行切割
['1', '1', '1', '1'] 切割后的结果。
>>> s = 'a href="/offensive-security-solutions/virtual-penetration-testing-labs/'
>>> re.split(r'/',s)
['a href="', 'offensive-security-solutions', 'virtual-penetration-testing-labs', ''] 结果显示字符串按‘/’字符进行了切割。
>>> re.split(r'[/\-]',s) 这里不可以直接用-,它本身表示的是范围 应加个转义字符 \
['a href="', 'offensive', 'security', 'solutions', 'virtual', 'penetration', 'testing', 'labs', '']
>>>
针对网络数据分割还是可以的
############################ 分组 ###############################
使用()做分组,
>>> email = r'\w{3}@\w+(\.com|\.cn)' 使用()将.com和.cn分组 ,在分组中可以做 与 或 非 等。。。
>>> re.match(email,'bai@bai.com')
<_sre.SRE_Match object at 0xb74a28a0>
>>> re.findall(email,'bai@bai.com')
['.com'] 注:findall返回时优先返回分组中匹配的数据
>>>
>>> s = '''
... jinttina fkjdf 123+x n jfdkj
... 123+5 n fjkdjgfkjdgjdfgj;da fjd fjdskf fksd fjdsk gksd
... jdkjfkjdkf f djfk dsafd saf d fd sf 123+1 n jfkdfj
... '''
>>> rx = r'123.. n'
>>> re.findall(rx,s)
['123+x n', '123+5 n', '123+1 n']
>>> rx = r'123(..) n' 做分组,
>>> re.findall(rx,s)
['+x', '+5', '+1'] 只会显示分组的数据
>>>
浙公网安备 33010602011771号