手记

未知领域系列:Python之正则表达式和JSON(五)

今天我们来学习Python的正则表达式,我想接触过其他语言的朋友一定不陌生,正则表达式并不是python特有的,其他语言也有正则表达式。

正则表达式的官方介绍为:正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

学习点

在python中使用正则表达式,需要在文件头部引入正则表达式的内置对象才能使用

import re

常用的方法为

re.findAll()

例1 匹配数字

import re

a='hdhfdh55df5df49d+'
r=re.findall('\d',a)   
print(r)

输出:[‘5’, ‘5’, ‘5’, ‘4’, ‘9’]

解释:

方法中的第一个参数 /d 表示只匹配字符串中的数字,第二个参数 a 表示需要操作的字符串变量

想了解更多的正则表达式方法可自行进行百度学习,这里只进行部分常见的规则进制学习。

例2 字符集

#字符集
import re

a='abc,abd,acc,abd,asd'
r=re.findall('a[cb]d',a)
s=re.findall('a[^cb]d',a)
print(r)
print(s)

输出1:[‘abd’, ‘abd’]
输出2:[‘asd’]

解释:

方法中第一个参数使用了 [cd ] 这个符号,表示只要子子串中出现了其中一个都会匹配上,反之如果是这样 [^cd ] 符号中加了 ^ 符号则表示子串中只要包含了其中一个字符都不会被匹配上

例3 概括字符集

#概括字符集
import re

#\d  数字 \D  非
#\w   单词字符   \W  非
# \s 空白字符   \S 非
a='5566dfd5fdg5gs26s0'

r=re.findall('[1-9]',a)
s=re.findall('[^0-9]',a)
f=re.findall('\w',a)
print(r)
print(s)
print(f)

输出:

[‘5’, ‘5’, ‘6’, ‘6’, ‘5’, ‘5’, ‘2’, ‘6’]
[‘d’, ‘f’, ‘d’, ‘f’, ‘d’, ‘g’, ‘g’, ‘s’, ‘s’]
[‘5’, ‘5’, ‘6’, ‘6’, ‘d’, ‘f’, ‘d’, ‘5’, ‘f’, ‘d’, ‘g’, ‘5’, ‘g’, ‘s’, ‘2’, ‘6’,
‘s’, ‘0’]

解释:

[1-9] 表示只匹配数字
[^0-9] 表示匹配除去数字外的字符
\w 表示匹配打个词的字符

例4:数量词

#数量词
import re

a='5566dfd5fdg5gs26s0'
r=re.findall('[a-z]{2,6}',a)
s=re.findall('[a-z]{2,6}?',a)
#贪婪  与 非贪婪
#python 默认贪婪
#非贪婪 后面加问号
print(r)
print(s)

输出:

[‘dfd’, ‘fdg’, ‘gs’]
[‘df’, ‘fd’, ‘gs’]

解释:

[a-z]{2,6} 表示只匹配连续的2到6个英文字符的子串,匹配尽可能多的连续字符 (贪婪的
[a-z]{2,6}? 表示只匹配连续的2到6个英文字符的子串,但它是非贪婪的,所以它匹配的总是匹配最少额连续字符,总是匹配连续的2个字符 (非贪婪的

  • Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试匹配尽可能少的字符
#数量词
#*  匹配0次或者无限次
#? 匹配0次或者1次
#+  匹配1次或者无限次
import re

a='pytho5python4pythonn2'

r=re.findall('python?',a)
r2=re.findall('python*',a)
r3=re.findall('python+',a)

print(r)
print(r2)
print(r3)

输出:

[‘pytho’, ‘python’, ‘python’]
[‘pytho’, ‘python’, ‘pythonn’]
[‘python’, ‘pythonn’]

例5 边界匹配

#边界匹配
import re
qq='100001'
#4~8
r=re.findall('01$',qq)
print(r)

输出:

[‘01’]

解释:

01$ 表示只要字符串最后为 01 则输出01

例6 组

#组  ()
import re

a='pythonpythonpython222'
r = re.findall('(python){3}',a)

print(r)

输出:

[‘python’]

解释:

(python){3} 表示只要字符串有连续3组 python 字符串 则输出 python

例7 第三个参数

#第三个参数
import re

a='PythonC#Java'
#.号匹配任何字符包括换行符 \n

r=re.findall('C#.{1}',a,re.I)

# re.I 表示忽略大小写   re.S 表示改变.号的行为
# r=re.findall('C#.{1}',a,re.I | re.S)
print(r)

输出:

[‘C#J’]

解释:

C#.{1} 着重使用 点 字符 匹配后面任何一个字符
re.I 第三个参数就是结合 点号使用的

例8 替换

#替换  
import re
a='PythonC#Java'
# 1表示只替换第一个 
r = re.sub('C#','GO',a,1)

#内置函数替换
b = a.replace("C#","GO")

print(b)
print(r)

输出:

PythonGOJava
PythonGOJava

解释:

re.sub(‘C#’,‘GO’,a,1) 使用字符串 GO 替换 字符串 C# 并且只替换 a 字符串中第一个出现的 C# 子串

例9 使用函数替换操作

# 使用函数替换操作
import re
a ='Abc5566555'

#函数
def show(value):
    #打印出来的是一个对象
    #print(value)
    #获取集体的值
    matched = value.group()
    if int(matched) >= 6:
        return '9'
    else:
        return "7"

r = re.sub('65',show,a)

print(r)

输出:

Abc556955

解释:

这个逻辑比较难理解,就是字符串需要替换 65 但65又作为参数传入 show()函数中,通过一系列的操作,获取到 int 类型的65 再与 6 比较 若 65 大于等于 6 则字符串 a 中的65替换为9 反之替换为 7

例10 其他函数匹配

import re
#其他函数匹配
s = 'C55ff55566'
r = re.match('\d',s)
print(r)
#获取匹配的位置
print(r.span())
r2 = re.search('\d',s)
print(r2)
#获取值
print(r2.group())

(不知为何,本地未成功输出)

注:与 findAll() 不同之处为他们都只匹配一次

例11 较复杂组() 匹配

import re

s = 'int sdf= dfd d, python , i love java'

#使用组匹配  ()  ,可以多个组
r = re.findall('int(.*)python(.*)java',s)

print(r.group(1,2))
#获取全部组
print(r.groups())

(不知为何,本地未成功输出)

  • 一共刚好 11 个例子 ,今天刚好 11.11
1人推荐
随时随地看视频
慕课网APP