想当初,刚学会python时,写的第一个脚本就用了大量的正则,那时也是一边写一遍百度。回头看来发现re在日常中用的挺多的,自己简单做个笔记,方便后续查找。
1、匹配用法
. 匹配任何字符
? 匹配前面的表达式0次或1次
* 匹配前面的表达式0次或多次
+ 匹配前面的表达式1次或多次
{N} 匹配重复前面的表达式N次,如[0-9]{3}表示任意000-999中的任意一个3位数
一个特殊的用法:最小匹配 .+?
( ) 匹配括号中的表达式,并保存为子组
举例:r'\d{2}\.\d{2}\.\d{2}\.\d{2}:(8080|3306)'
会匹配到10.50.33.45:8080和10.30.33.45:3306,
\d 数字[0-9] 反义\D
\w 所有字符和数字[a-zA-Z0-9] 反义\W
\s 匹配任何空白符[\n\t\r\v\f]
\b 表示边界 反义\B
2、关于匹配指定字段的使用
比如说字符串是aaa &d1nD$FA76 aaa,我想匹配到aaa中间的这一段字符,尝试了re.search()和re.findall(),发现findall()可以使用,两个代码示例如下
import re
passwd = 'aaa &d1nD$FA76 aaa'
namemode = 'aaa\s+' + '(.+?)' + '\s+aaa'
m = re.search(namemode, passwd)
if m is not None:
print(m.group())
-----------------------
输出结果,整行都输出了,但是我其实只想要&d1nD$FA76
aaa &d1nD$FA76 aaa
////////////////换一种思路继续来/////////////////////////
import re
passwd = 'aaa &d1nD$FA76 aaa'
namemode = 'aaa\s+' + '(.+?)' + '\s+aaa'
m = re.findall(namemode, passwd)
print(m)
-----------------------
这里面输出了一个序列类型的结果,如果改成print(m[0])可以直接得到&d1nD$FA76,缺点是必须确保匹配条件的精确性,否则会输出一堆匹配结果的列表
['&d1nD$FA76']
3、re.sub()的局限性
之前有一次用sub来替换某一段字符时一直不生效,一度以为是不是自己哪里写错了,后来实践了后发现,如果被替换的字符中含有‘$’的话re.sub()是没法生效的,这种情况下可以借助于replace的用法来实现,继续拿上面的举例
import re
names = 'aaa &d1nD$FA76'
namemode = 'aaa\s+' + '(.+)'
newpass = '12345678'
oldpass = re.findall(namemode, names)[0]
result = re.sub(oldpass,newpass,names)
print(result)
------------------------
输出结果 这里发现还是输出了原来的字符,没有将&d1nD$FA76替换为12345678
aaa &d1nD$FA76
//////////////////接下来换一种方法/////////////////////
import re
names = 'aaa &d1nD$FA76'
namemode = 'aaa\s+' + '(.+)'
newpass = '12345678'
oldpass = re.findall(namemode, names)[0]
result = names.replace(oldpass,newpass)
print(result)
-------------------------------------
输出结果 发现结果替换成功了
aaa 12345678