day17-正则表达式

1.正则基本符号

1.什么是正则表达式
正则表达式就是字符匹配工具;是由正则符号和普通字符组成,来匹配不同规律的字符串

2.python对正则表达式的支持
python中提供了一个re模块,用来支持正则表达式
fullmatch(正则表达式,字符串) -
用正则表达式去完全匹配字符串,如果匹配成功.返回一个匹配结果,失败返回None
python中的正则表达式的写法:将正则内容写在字符串中,一般这个字符串最前面会加一个r/R

"""
import re

1.普通字符

"""
普通字符在正则表达式中代表字符本身
"""

匹配一个字符串,第一个字符是a,第二个字符是b,第三个字符也是最后一个字符是'c'

re_str = r'abc'
result = re.fullmatch(re_str, 'abc')
print(result)

2. .(匹配除‘\n’外的任意字符)

"""
在正则表达式中, .出现的位置,可以匹配一个任意字符
注意:一个点只能匹配一个字符
"""

匹配一个长度是3的字符串,并且第一个字符是'a',最后一个字符是'c',中间是任意字符

re_str = r'a.c'
result = re.fullmatch(re_str, 'a\tc') # \n不能匹配
print(result)

3. \w(匹配字母数字或者下划线)

"""
在正则表达式中,\w出现的位置,可以匹配 一个 任意的字母、数字或者下划线(也可以匹配Unicode编码中除了ASCLL码剩下的部分)
"""

匹配一个长度是4的字符串,并且字符串的前一位是数字字母或者下划线,后面三位是任意字符

re_str = r'\w...'
result = re.fullmatch(re_str, '22kk')
print(result)

4.\s(匹配空白字符)

"""
空白字符包括:空格、制表符和换行符
"""

匹配一个长度是4的字符串,并且字符串前两位是数字字母或者下划线(中文),中间空白,再一个数字字母下划线(中文)

re_str = r'\w\w\s\w'
result = re.fullmatch(re_str, 'h2\n8')
print(result)

5.\d(匹配数字字符)0-9

re_str = r'\d\d..'
result = re.fullmatch(re_str, '12.\')
print(result)

6.\b(检测单词边界)

"""
注意:检测 \b 出现的位置是否是单词边界,不会对字典进行匹配。

单词边界:单词开头,单词结尾,标点符号,空白符号等,只要能够将单词区分开的符号都属于单词边界
"""
re_str = r'hello\b python'
result = re.fullmatch(re_str, 'hello python')
print(result)

7.^(检测字符串开头)

"""
在match和fullmatch中没有意义,在search,findall等中有意义
"""

匹配一个字符串前面三个字符是否是'The',后面三个是任意字符

re_str = r'^The...'
result = re.fullmatch(re_str, 'The123')
print(result)

8.$(检测字符串结尾)

"""
在match和fullmatch中没有意义,在search,findall等中有意义
"""

匹配一个字符串,只有三位,分别是'The'

re_str = r'The$'
result = re.fullmatch(re_str, 'The')
print(result)

9.

"""
\大写字母 '对应的功能是' \小写字母 功能取反
\W - 匹配非数字字母下划线
\D - 匹配非数字
\S - 匹配非空白字符
\B - 检测非单词边界
"""

10.

"""

例如:[字符集] - 匹配字符集中的任意一个字符

注意:a.一个中括号只能匹配一个字符
b.正则表达式的单个符号都代表本身例如: . $ ^ + * ? | 等
c.匹配字符的组合符号,在中括号中保持原来的功能,例如:\w, \d, \S等
"""
re_str = r'\d[abc]'
result = re.fullmatch(re_str, '1c')
print(result)

"""
2.[字符1-字符2] - 表示字符1到字符2(注意:字符1的编码值要小于字符2)
[a-z] - 表示所有的小写字母
[A-Z] - 表示所有的大写字母
[a-zA-Z] - 表示所有的字母
[0-9] - 表示数字0到9
[\u4e00-\u9fa5] - 匹配所有的中文
[字符1字符2-] - 这儿的 - 表示减号本身
"""
re_str = r'[0-9]'
result = re.fullmatch(re_str, '0')
print(result)

11.[^字符集] - 匹配不在字符集中的任意一个字符

"""
[^abc] - 匹配除了'a','b','c'以外的任意一个字符
[^a-z] - 匹配除了小写字母以外的任意一个字符
[abc^] - 匹配'a','b','c','^'中的任意一个字符
"""

2.正则控制次数

import re

1.*(匹配0次或者多次)

"""
a* - a 出现0次或者多次, '','a', 'aaa'...
\d* - 任意数字出现0次或者多次
[abc]* - 字符a,b,c出现0次或者多次
"""
print(re.fullmatch(r'a*b', 'aaaab'))

2. +(匹配至少一次或者多次)

3. ?(匹配0次或者1次)

写一个正则表达式匹配一个整数(正整数和负整数都可以)

re_str = r'[+-][1-9][0-9]'
result = re.fullmatch(re_str, '0')
print(result)

4.{}

"""
{N} - 匹配N次,a{3} 匹配三个'a'
{M,N} - 匹配M到N次,M比N小
{,N} - 最多匹配N次
{M,} - 至少M次
"""

练习:输入密码,要求检查密码输入是否合格(密码由字母数字组成,数字不开头,6-12位)。给出提示是否正确

re_str = r'[a-zA-Z][\da-zA-Z]{5,11}'
mima = input('请输入密码:')
if re.fullmatch(re_str, mima):
print('密码输入正确!')
else:
print('密码输入错误!')

3.分支、捕获和贪婪

1.分支

"""
条件1|条件2 - 匹配条件1或者条件2
注意:正则表达式中分支也会出现短路,当条件1可以匹配,就不会使用条件2进行匹配
"""

练习:写一个正则表达式,匹配所有的数字

import re

print(re.fullmatch(r'[+-]?0[.]?\d|[+-]?[1-9]+[.]\d*', '-1.0'))

2.()捕获和分组

"""
a.分组 - 将括号的内容作为一个整体
"""
re_str = r'abc(\d{3}|[A-Z]{3})'
print(re.fullmatch(re_str, 'abc123'))
re_str = r'(\d[a-z]){3}'
print(re.fullmatch(re_str, '2d3d5f'))

"""
b.捕获
通过正则获取符合条件的子串的时候,可以再正则表达式中加括号,来实现匹配后只返回以括号中匹配到的内容为元素的列表
re.findall(正则表达式, 字符串) - 在字符串中去获取符合正则表达式条件的所有的子串,返回的是一个列表
"""
str1 = 'sdaf654da654f6a4f6af46a4f+a4f6a'
print(re.findall(r'\d+', str1))
print(re.findall(r'f(\d+)', str1))

"""
c.重复匹配
带多个分组的正则表达式,可以在分组的后面通过添加'\数字'来重复前面第几个分组中匹配到的内容

说明:\数字 - 这儿的数字代表前面第几个分组;\1代表第一个分组, \2代表第二个分组
"""
re_str = r'(\d{3})([a-z]{2})a\1\2'
print(re.fullmatch(re_str, '123qqa123qq'))

3.贪婪

"""
匹配次数后加?就是贪婪匹配:*?, +?, ??, {}? - 表示尽可能少的重复
"""
re_str = 'a.+?b'
str1 = 'xxxahdbsdffagvbsx'
print(re.findall(re_str, str1))

4.转义符号

"""
在正则表达式中可以在有特殊意义或者特殊功能的符号前加‘\’来取消其特殊的功能
\w - 代表两个字符,分别是'','w'
+ - 代表'+'字符
[],(),{}表示字符的时候,前面也要加
...
注意:在中括号中,\加\表示\本身,在最前面加\表示本身,-在两个字符之间加\表示-本身
"""
re_str = r'\w-\d{3}'
print(re.fullmatch(re_str, '\w-232'))

反斜杠个数除以2,得到的结果如果有小数部分则整数部分加1

print('\\\w-123')

4.re模块

import re

1.complie

"""
complie(正则表达式) - 将正则表达式转换成正则表达式对象
转换成对象后可以通过对象调用对象方法

"""
re_str = '\d{3}'
re_obj = re.compile(re_str)

调用模块中的函数

print(re.fullmatch(re_str, '234'))

调用对象方法

print(re_obj.fullmatch('234'))

2.match和fullmatch

"""
a.fullmatch(正则表达式, 字符串) - 完全匹配,从字符串开头匹配到字符串结束
b.match(正则表达式, 字符串) - 不完全匹配,只匹配到字符串开头
"""
re_str = r'\d[A-Z]{2}'
result = re.fullmatch(re_str, '2HK')
print(result)

re_str = r'\d([A-Z]){2}'
result1 = re.match(re_str, '8KLdfa')
print(result1)

匹配对象

"""
1.span - 匹配到的内容的范围,(开始下标,结束下标)
匹配对象.span() - 获取整个正则表达式匹配到的范围
匹配对象.span(n) - 获取正则表达式中第n个分组匹配到的范围(前提是有分组)
"""
print(result1.span())
print(result1.span(1))

"""
2.start和end - 获取匹配结果的开始下标和结束下标
匹配对象.start()/匹配对象.end() - 获取整个正则表达式匹配到的开始下标/结束下标
匹配对象.start(n)/匹配对象.end(n) - 取正则表达式中第n个分组匹配到的开始下标/结束下标
"""
print(result1.start(), result1.end())
print(result1.start(1), result1.end(1))

"""
3.group - 获取匹配到的内容
匹配对象.group() - 获取整个正则表达式匹配到的内容
匹配对象.group(n)- 获取正则表达式第n个分组匹配到的范围
"""
print(result1.group())
print(result1.group(1))

"""
4.string - 获取用来匹配的原字符串
匹配对象.string
"""
print(result1.string)

3.search

"""
search(正则表达式, 字符串) - 匹配字符串中第一个满足正则表达式的子串,如果匹配成功返回匹配对象,否则返回None

"""
str1 = 'abc123fsd156fs1f5sd1'
result1 = re.search(r'\d{3}[a-z]{2}', str1)
print(result1)

4.split

"""
split(正则表达式, 字符串) - 在字符串中按照满足正则表达式条件的子串对字符串进行切割
返回是一个列表
"""
str1 = 'ab+1da35sf13_a1f35sd1g3a'
result = re.split(r'\d+', str1)
print(result )

5.sub

"""
sub(正则表达式, 新子串, 字符串) - 用新子串替换字符串中满足正则表达式的子串,返回一个替换后的字符串
"""

6.findall

"""
findall(正则表达式, 字符串) - 在字符串中获取满足正则表达式的所有的字符,返回一个列表,列表元素是字符串

注意:如果正则表达式中有一个分组,结果是列表中只取这个分组匹配到的结果
如果这个正则表达式中分组个数大于1,结果就是一个列表,列表中的元素就是元组,元组中是每个分组匹配到内容
"""

7.finditer

"""
re.finditer(正则表达式, 字符串) - 获取字符串中满足正则表达式的内容,返回的是一个迭代器,迭代器中的元素是匹配对象
"""

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • from re import fullmatch, search,findall 正则表达式就是用来检测字符串是否...
    文_36e3阅读 379评论 0 0
  • 正则表达式 正则表达式使用匹配或者秒速字符串的工具。用处:a.判断字符串是否满足某个条件--判断输入的字符串是否是...
    文_36e3阅读 519评论 0 0
  • 一、正则表达式语法 正则表达式是用匹配或者描述字符串的工具。 用处:a.判断字符串是否满足某个条件---判断输入的...
    大漠判官1阅读 348评论 0 1
  • 运营,对于当时作为应届毕业生而言的我,喜欢混网络,曾经找到兴趣群并且成为一个小的领导者,等等,这样的我,有点小心得...
    Rain_v阅读 264评论 1 2
  • 王蓝胖阅读 3,205评论 0 2