正则表达式实例

这里写目录标题

  • 实例1:指定出生年份ID搜索
  • 实例2:找指定首字母的单词
  • 实例3:re.MatchObject对象的方法

实例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

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

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

你可能感兴趣的:(实训)