python—正则表达式

实际使用

正则解决的是高效率使用字符串的问题,而字符串操作贯穿整个程序执行,其重要程度可见一斑。
另外,爬虫对正则是强需求。

re.findall和re.sub是最常用的,也是最易用的,至于re.match和re.search不知为何所有正则都要大篇幅介绍,但是用起来繁琐,比findall差远了,这里不列举。

典型用例

1 字符集——概括性的字符集使用

  • \d \s \w
L = "python123php932-we2 w@3"
# 1 字符集——概括字符集 \s \w \d . 大写是互补
a1 = re.findall(r"\d",L) #\d 表示数字[0-9]
a2 = re.findall(r"\D",L) #\D 表示非数字
a3 = re.findall(r"\w",L) #\w 表示数字和字母
a4 = re.findall(r"\W",L) #\W 表示非数字和字母
a5 = re.findall(r"\s",L) #\s 表示空格键
a6 = re.findall(r"\S",L) #\S 表示匹配非空格键
print(a1)#['1', '2', '3', '9', '3', '2', '2', '3']
print(a2)#['p', 'y', 't', 'h', 'o', 'n', 'p', 'h', 'p', '-', 'w', 'e', ' ', 'w', '@']
print(a3)#['p', 'y', 't', 'h', 'o', 'n', '1', '2', '3', 'p', 'h', 'p', '9', '3', '2', 'w', 'e', '2', 'w', '3']
print(a4)#['-', ' ', '@']
print(a5)#[' ']
print(a6)#['p', 'y', 't', 'h', 'o', 'n', '1', '2', '3', 'p', 'h', 'p', '9', '3', '2', '-', 'w', 'e', '2', 'w', '@', '3']

2 字符集——量词的使用

  • 基本量词
L = "python123php932java278js w@3"
a1 = re.findall("[a-z]{2,6}", L)# [a-z]表示需要匹配的字母范围;{2,6}表示量词,重复的次数范围
print(a1)# ['python', 'php', 'java', 'js']
  • 其他量词:*?+
L = "pytho3php2python3pythonnn328jsw@3"
a1 = re.findall("python*", L)# *匹配前面字符0次或者无限多次
a2 = re.findall("python+", L)# +匹配前面字符1次或者无限多次
a3 = re.findall("python?", L)# ?匹配零次或者一次,可以去重
print(a1)# ['pytho', 'python', 'pythonnn']
print(a2)# ['python', 'pythonnn']
print(a3)# ['pytho', 'python', 'python']

3 字符集——贪婪和非贪婪

从2的例子可以看出,当量词是{2,6}时,因为默认的贪婪搜索模式,所以即使符合最小值2时,查找依旧不停,继续查找至6.这就是所谓贪婪。在后面加个可以变成非贪婪匹配。据说正则的坑大部分都在此。

L = "python123php932java278js w@3"
a1 = re.findall("[a-z]{2,6}", L)# [a-z]表示需要匹配的字母范围;{2,6}表示量词,重复的次数范围
print(a1)# ['python', 'php', 'java', 'js']
a2 = re.findall("[a-z]{2,6}?", L)
print(a2)#['py', 'th', 'on', 'ph', 'ja', 'va', 'js']

4 边界匹配:^$

举例,想要匹配4-9位的qq号,如果单纯使用量词而不使用边界占位符进行匹配,很容易出现问题。

qq = "1000154501"#10位的qq号,使用下面正则进行匹配

a1 = re.findall("\d{4,9}", qq)# 失败,因为竟然能匹配出来!
print(a1)# ['100015450']
a2 = re.findall("\d{4,9$}", qq)
print(a2)# []

边界占位符,就是设定个靶点,$表示末尾,则^表示开头

qq = "qq1000154501"
a3 = re.findall("^\d", qq)
print(a3)# [],因为是从第一个字符匹配,如果失败则为空
a4 = re.findall("\d", qq)
print(a4)# ['1', '0', '0', '0', '1', '5', '4', '5', '0', '1']

5 re.sub的重大意义

  1. 简单替换
L = "A9849379541D11S"
a1 = re.sub("A","flower", L)# 将字符串中的A替换为flower
print(a1)# flower9849379541D11S

  1. 需要根据不同条件替换不同字符串时,可以把函数当作参数传入进来
L = "A698469379541D11S"
def sub_test(value):

    tmp = int(value.group())
    if tmp > 7:
        return "9"
    else:
        return "0"

a1 = re.sub(r"\d",sub_test, L)# 将大于7的字符替换为9,小于7的替换为0
print(a1)# A099009009000D00S
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值