day17-正则表达式

正则符号

1.什么是正则

正则是字符串匹配的一种工具,拥有自己的语法。语法中主要包含各种符号的使用

2.正则语法

re.fullmatch(正则表达式,字符串) - 检查字符串是否完全符合正则表达式的规则(完全匹配)
匹配成功返回匹配对象,失败返回None
正则表达式 - python中正则表达式是写在引号(单引号或双引号)中的内容,
一般会在引号的前面加r
r'正则表达式'

js中的正则:/正则表达式/

print('==============匹配符号=================')
# 1)普通字符  -   除了正则中有特殊功能和特殊意义以外的其他所有字符
# 普通字符在正则中表示字符本身
# 例如:a,b,c,1,2,3,~,你,

# 表示一个字符串有三个字符,每个字符分别是a,b,c
re_str = r'abc'
result = re.fullmatch(re_str, 'abc')
print(result)

2) . - 匹配任意字符

正则中出现 . 的位置可以匹配任意字符
一个 . 只能匹配任意字符

# 匹配一个长度是3的字符串,字符开头是a,结尾是b,中间任意字符
re_str = r'a.b'
result = re.fullmatch(re_str, 'a9b')
print(result)

3)\w - 匹配字符、数字或者下划线(只针对ascii码有效)

一个\w只能匹配一个字符
注意:Unicode码中除了ASCII表以外的其他字符都能匹配

result = re.fullmatch(r'a\wb.', 'a_b4')
print(result)

4)\s - 匹配一个空白字符

空白:空白、回车/换行、制表符

result = re.fullmatch(r'abc\s123', 'abc\n123')
print(result)

5) \d - 匹配一个数字字符

result = re.fullmatch(r'a\d\db', 'a89b')
print(result)

6) \大写字母 - 匹配非\小写字母匹配到的内容

\W - 匹配非数字、字母、下划线
\S - 匹配非空白字符
\D - 匹配非数字字符

result = re.fullmatch(r'\D\Dabc\S123', 'qwabc1123')
print(result)

7) [] - 匹配字符集

a.普通用法
[字符集] - 匹配字符集中的任意字符
[az1+] - 匹配一个字符是a或者z或者1或者+
[\dabc] - 匹配一个字符是数字或者a或者b或者c

b.表示范围的字符集 [字符1-字符2] - 从字符1到字符2中任意一个字符,字符2的编码值必须大于字符1
[5-9] - 匹配数字字符5到9中任意一个
[a-z] - 匹配小写字母中的任意一个
[a-zA-Z] - 匹配任意一个字母
[a-zA-Z\d_] - 匹配字母数字下划线

c.反向选中:[^字符集] - 选中除了字符集中以外的其他的任意一个字符
[^abc] - 只要不是a或者b或者c都匹配

print(re.fullmatch(r'[az1]abc', '1abc'))
print(re.fullmatch(r'[\daz1]abc', '3abc'))
print(re.fullmatch(r'[a-z]abc', 'vabc'))
print(re.fullmatch(r'[5-8][5-8]', '67'))

print('==============检测符号=================')
# 一个匹配符号必须对应一个具体的字符;检测符号只是对符号所在的位置进行检查,不会影响字符串的长度
# 1)\b    -   检测是否是单词边界
"""
单词边界:一切可以将两个单词区分开的符号都是单词边界,例如单词开头、单词结尾、空白标点符号等
"""
# 匹配一个字符串是'howare',然后检测w的后面是否是单词边界
print(re.fullmatch(r'how\b are', 'how are'))
# 2) ^  -   检测^所在的位置是否是字符串开头
print(re.fullmatch(r'^abc', 'abc'))
print(re.search(r'abc', '123abc567'))
# 3) $    -   检测$所在的位置是否是字符串结尾

1.匹配次数

1)* - 匹配0次或多次

字符 * 前的字符出现0次或者多次
r'a
' - '', 'a', 'aa', 'aaa'

print(re.fullmatch(r'a\d*b', 'a3534656b'))

2) + 匹配一次或多次

print(re.fullmatch(r'a\d+b', 'a8823b'))

3)? 匹配0次或一次

print(re.fullmatch(r'[+-]?\d+', '+293'))

4){}

{N} - 匹配N次
{M,N} - 匹配M到N次
{M,} - 匹配至少M次
{,N} - 匹配最多N次

print(re.fullmatch(r'a{3}123', 'aaa123'))
print(re.fullmatch(r'a{2,5}123', 'aaa123'))
print(re.fullmatch(r'a{2,}123', 'aa123'))
print(re.fullmatch(r'a{,2}123', 'aa123'))

# qq = input('请输入球球号')
# print(re.fullmatch(r'[1-9]\d{4,11}', qq))
# user_name = input('账号')
# print(re.fullmatch(r'[\da-zA-Z_]{6,20}', user_name)

2.贪婪和非贪婪

, +, ?, {}对应匹配次数是贪婪;在匹配次数不确定的时候才有贪婪和非贪婪区分
在匹配次数不确定的符号后面叫?,就会变成贪婪:
?, +?,??,{M,N}?,{M,}?, {,N}?

贪婪:在匹配成功的前提下尽可能多的匹配
非贪婪:在匹配成功的前提下,尽可能少的匹配

result = re.search(r'.+b', '123bcccbdddb====')
print(result)
print(re.search(r'.+?b', '123bcccbdddb===='))

3.分之

正则表达式1|正则表达式2

print(re.fullmatch(r'\d{3}|[a-zA-Z]{3}', 'asd'))

4. () - 分组

1.分组 - 将正则中的一部分看成一个整体进行操作
2.重复 - 添加分组后,可以在分组的后面通过'\M'来处重复前面第M个分组匹配到的结果

print(re.fullmatch(r'(\d{3}|[a-zA-Z]{3})[A-Z]+', '123WEEWFSD'))
print(re.fullmatch(r'(\d{2}:)+\d\d', '23:43:36:78'))
print(re.fullmatch(r'(\d+)abc\1', '100abc100'))

5.转义符号 - 在正则符号前加\,让这个符号的功能消失

正则中的转义符号和字符串的转义字符不一样
独立额特殊符号放在[]中特殊意义会自动消失,但-,[] ... 除外

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

print(re.fullmatch(r'\d\+\\d', '2+\d'))
print(re.fullmatch(r'[.+*]abc[?]', '.abc?'))    # .  *  +  ?
print(re.fullmatch(r'[a\-z]abc', '-abc'))

print(re.fullmatch(r'[a\]]abc', ']abc'))

1.创建正则对象

compile(正则表达式) - 根据正则表达式创建正则对象

re_obj = compile(r'\d{3}')
print(re_obj.fullmatch('234'))

2.匹配

fullmatch(正则表达式,字符串) - 让整个字符串和正则表达式进行匹配
match(正则表达式, 字符串) - 匹配字符串开头
返回值:匹配成功是匹配结果对象,匹配失败是None

result = fullmatch(r'\d{3}[a-z]{4}', '123jsdv')
print(result)

result = match(r'(\d{3})[a-z]{4}', '124sdfsaqqw你好')
print(result)

匹配结果
1)匹配结果对应的字符串

匹配对象.group() - 获取整个正则匹配到的结果
匹配对象.group(N) - 获取第N个分组匹配到的结果

print(result.group())
print(result.group(1))

2)获取匹配位置

匹配对象.span(group=0)
匹配对象.start(group=0)
匹配对象.end(group=0)

print(result.span(1))
print(result.start())
print(result.end())

3)获取原字符串

print(result.string)

3.查找

search(正则表达式, 字符串) - 匹配出字符串中第一个满足正则表达式的字串,结果是匹配对象
findall(正则表达式, 字符串) - 获取字符串中满足正则表达式的所有字串;结果是列表,列表中是字符串
finditer(正则表达式, 字符串) - 获取字符串中满足正则表达式的所有的字串;结果是迭代器,迭代器的元素是匹配对象

result = search(r'\d{3}', 'how2144b345in432ln567')
print(result)

result = findall(r'\d{3}', 'how2144b345in432ln567')
print(result)

result = findall(r'(\d{3})a', 'how2144ab345in432aln567')
print(result)

result = finditer(r'(\d{3})a', 'how2144ab345in432aln567')
print(next(result))
print(next(result))

4.切割

split(正则表达式, 字符串) - 按照满足正则表达式的字串对字符串进行切割,返回列表

str1 = 'aaa9bb99ddsf239945529dg14956'
print(str1.split('9'))

print(split(r'\d+', str1))

5.替换

sub(正则表达式, 字符串1, 字符串2, 替换次数=0) - 将字符串2中满足正则表达式的字串替换成字符串1
替换次数为0则全部替换

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

推荐阅读更多精彩内容

  • 01-基本符号 1.什么是正则 正则表达式就是一个字符匹配的工具;是由正则符号和普通字符组成,来匹配不同规律的字符...
    71a5d7e107e5阅读 308评论 0 0
  • 17.1 正则基本符号 1.什么是正则表达式 正则表达式就是字符匹配的工具,用来做正则匹配;是由正则符号和普通字符...
    2333_11f6阅读 240评论 0 0
  • 前言回顾 1.运算符重载 通过在类中实现运算符对应的魔法方法,来让类的对象支持相关运算符的操作 2.内存管理(面试...
    不语sun阅读 360评论 0 0
  • 1.正则基本符号 1.什么是正则表达式正则表达式就是字符匹配工具;是由正则符号和普通字符组成,来匹配不同规律的字符...
    杨海py阅读 795评论 0 0
  • 今天从网上买的衣服和鞋都到了,还比较满意,果然人瘦了之后穿什么都比较好看,但是腿还是有很大的减肥空间,再坚持下,到...
    不开灯的房间s阅读 101评论 0 0