当前位置 : 主页 > 编程语言 > python >

关于python中RE用法的一些总结

来源:互联网 收集:自由互联 发布时间:2022-08-15
想当初,刚学会python时,写的第一个脚本就用了大量的正则,那时也是一边写一遍百度。回头看来发现re在日常中用的挺多的,自己简单做个笔记,方便后续查找。 1、匹配用法 . 匹配任

想当初,刚学会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

上一篇:PySide6开发环境配置(使用PyCharm)
下一篇:没有了
网友评论