欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

正则表达式实例

程序员文章站 2022-03-16 21:37:23
...

实例1:指定出生年份ID搜索

实例1
找出所有1970-1979出生的ID

// 代码:找出所有1970-1979出生的ID
import re  # 导入正则包# 找出所有1970-1979出生的ID
IDids = ['3504241978xxxxxxxxx', '3705021992xxxxxxxx', '3705021975xxxxxxxx']#给定的数据
id197x = [aID for aID in IDids if re.match(r'\d{6}197.{9}', aID)]#列表推导式,关键在于推导式里面的正则表达式
print(id197x)
// 结果
C:\Users\mzq\Anaconda3\envs\hello\python.exe C:/Users/mzq/PycharmProjects/hello/main.py
['3504241978xxxxxxxxx', '3705021975xxxxxxxx']

进程已结束,退出代码0

// A code block
re.match()用法是用来进行正则匹配检查的方法,若字符串匹配正则表式,
则match()方法返回匹配对象(Match Object),否则返回None

re.match(pattern,string, flags=0)
pattern:正则表达式
string:待搜索的字符串
flags:控制表达式的匹配方式,如大小写等

在实例中的正则表达式 : r'\d{6}197.{9}

r的作用 :
Python中字符串前面加上 r 表示原生字符串,消除了转义字符在字符串中的歧义
’\d{6}197.{9}`的含义
\d表示匹配数字即[0-9]在此处表示匹配出生年份(\D表示匹配非数字,与\d恰好相反)
{6}表示从字符串的第6位开始匹配{9}表示一直到第9位在这之间的字符从最开始只要匹配197即符合要求
变化
若将例子中的197改为19也可以作用变为找19xx年的年份
而若将197改为97用来寻找 x97x 年的则不可以因为match()的检索就是在规定范围从最开始进行检索,若最开始就不匹配则返回None
而如果将match()换为search()即可以寻找 x97x 年的因为search()是只要有符合匹配的,不管在开始是否匹配,都可返回。

// match与search区别测试
import re  # 导入正则包# 找出所有1970-1979出生的ID
IDids = ['3504241978xxxxxxxxx', '3705021992xxxxxxxx', '3705021975xxxxxxxx']#给定的数据
id197x = [aID for aID in IDids if re.match(r'\d{6}197.{9}', aID)]#列表推导式,关键在于推导式里面的正则表达式
print('利用match检索197x年份的ID为: '+str(id197x))
idx97x = [aID for aID in IDids if re.match(r'\d{6}97.{9}', aID)]#列表推导式,关键在于推导式里面的正则表达式
print('利用match检索x97x年份的ID为: '+str(idx97x))
idx97x_ = [aID for aID in IDids if re.search(r'\d{6}8.{9}', aID)]#列表推导式,关键在于推导式里面的正则表达式
print('利用search检索xxx8年份的ID为: '+str(idx97x_))
// 输出结果
C:\Users\mzq\Anaconda3\envs\hello\python.exe C:/Users/mzq/PycharmProjects/hello/main.py
利用match检索197x年份的ID: ['3504241978xxxxxxxxx', '3705021975xxxxxxxx']
利用match检索x97x年份的ID: []
利用search检索xxx8年份的ID: ['3504241978xxxxxxxxx']

进程已结束,退出代码0

实例2:找指定首字母的单词

找出首字母为pr的单词


// An highlighted block
import re
words = ['no', 'print', 'Program', 'plug', 'prepare', 'at', 'present', 'practice']
word_pr = [word for word in words if re.match(r'^pr', word)]  # 匹配区分大小写
print(word_pr)
word_pr = [word for word in words if re.match(r'^pr', word, re.I)]  # 不区分大小写
print(word_pr)

// 结果
C:\Users\mzq\Anaconda3\envs\hello\python.exe C:/Users/mzq/PycharmProjects/hello/main.py
['print', 'prepare', 'present', 'practice']
['print', 'Program', 'prepare', 'present', 'practice']

进程已结束,退出代码0

正则表达式中’^pr’的含义
^作用
例:
'[abc]'表示字符串中有’a’或’b’或’c’就匹配成功
'^abc’表示字符串由’abc’开头就匹配成功
'^ [abc] '表示字符串由’a’或’b’或’c’开头的,
'[^abc]‘表示匹配’a’,‘b’,‘c’之外的字符。如果一个字符串是由’a’,‘b’,'c’组合起来的,那就是假

当^表示取反的时候,只有一种情况,就是在中括号里面,而且是每一个字符之外的。
链接: ^的用法.

故在此处的作用就是表示以pr开头的
正则表达式中re.I的含义
使检测对大小写不敏感,这个最常用,在调用时放在flag部分

实例3:re.MatchObject对象的方法

// An highlighted block
import re  # 导入正则包
line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)
if matchObj:
    print("matchObj.group() : ", matchObj.group())
    print("matchObj.group(1) : ", matchObj.group(1))
    print("matchObj.group(2) : ", matchObj.group(2))
else:
    print("No match!!")
// 结果
C:\Users\mzq\Anaconda3\envs\hello\python.exe C:/Users/mzq/PycharmProjects/hello/main.py
matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

进程已结束,退出代码0

正则表达式的含义
(.) 第一个匹配分组,. 代表匹配除换行符之外的所有字符。
(.?) 第二个匹配分组,. 后面多个问号?,代表非贪婪模式,即只匹配符合条件的最少字符

后面的一个.* 没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。

相关标签: 实训