实例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
找出首字母为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部分
// 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
正则表达式的含义:
(.) 第一个匹配分组,. 代表匹配除换行符之外的所有字符。
(.?) 第二个匹配分组,. 后面多个问号?,代表非贪婪模式,即只匹配符合条件的最少字符
后面的一个.* 没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。