day 17 正则表达式

一 匹配字符的符号

正则表达式就是做字符串匹配的一种工具,很多语言都支持正则语法,正则语法是通用的

python中通过re模块提供的方法来使用正则

re.fullmatch(正则表达式,字符串)   ---完全匹配, 检查字符串是否满足正则表达式的要求;
                                     如果不匹配结果是None,匹配结果是一个对象
python正则表达式  --- r'正则'                                     
js正则表达式   --- /正则/
1 普通字符

普通字符在正则中代表字符本身,例如,a,b,1....等

要求一个字符串有5个字符,分别是h,e,l,l,o
re_str = r'hello'
result = re.fullmatch(re_str,'hello')
print(result)
2 .(匹配任意字符) 除了\n除外
  • 一个.(点)匹配任意字符
匹配一个字符串有三个字符,第一个是a,第二个是任意字符,最后一个是c,
re_str = r'a.c'
result = re.fullmatch(re_str,'abc')
print(result)
3 \w(匹配字母、数字、下划线)

一个\w只能匹配一个字符

注意:这个不严谨,还可以匹配中文等字符
不能匹配ASCII码表中的出了数字,字母,下划线以外的符号

 匹配一个字符串第一个字符是字母、数字、下划线,后面是abc
re_str = r'\wabc'
result = re.fullmatch(re_str,'胡abc')
print(result)
4 \s (匹配空白字符)

空白字符:空格、\t 、\n
一个\s只能匹配一个字符

 匹配一个长度是8的字符,要求前三个字符是任意字符,中间两个空白字符,最后匹配三个空白字符
re_str = r'...\s\s...'
result = re.fullmatch(re_str,'abc  abc')
print(result)
result = re.fullmatch(re_str,'abc\n\tabc')
print(result)
5 \d(匹配数字字符)
re_str = r'\d\dabc'
result = re.fullmatch(re_str,'12abc')
print(result)
6 \W(非数字、字母、下划线)
7 \S(非空白字符)
re_str = r'...\S\S...'
result = re.fullmatch(re_str,'abc12abc')
print(result)
8 \D(匹配非数字字符)
re_str = r'\D\Dabc'
result = re.fullmatch(re_str,'胡你abc')
print(result)

中括号(匹配字符集中的一个字符)

  • a.[普通字符集] --- 匹配字符集中的任意一个字符
  • b.[字符1-字符2] --- 匹配字符1到字符2中的任意一个字符(要求字符1的编码值小于字符2)
    [0-9] -----匹配所有的数字
    [a-z] --- 匹配小写字母
    [A-Z] --- 匹配大写字母
    [a-zA-Z] ---匹配所有的字母
    [\da-zA-Z] --- 匹配所有的数字和字母
    [\u4e00-\u9fa5] --- 匹配所有的文字

注意:一个[]只能匹配一个字符

 匹配一个长度是4的字符串,第一个字符是x或者y或者z,后面是abc
re_str = r'[xyz]abc'
print(re.fullmatch(re_str,'xabc'))

 匹配一个长度是4的字符串,第一个字符是x或者y或者或者数字
re_str = r'[\dxyz]abc'
print(re.fullmatch(re_str,'2abc'))

匹配一个长度是4的字符串,第一个是2到8中的一个
re_str = r'[2-8]abc'
print(re.fullmatch(re_str,'6abc'))
10 [^]

[^字符集] --- 匹配不在字符集中的任意一个字符
[^\u4e00-\u9fa5] -- 匹配一个非中文字符

二 检测字符的符号

\b(检测单词的边界)

\b --检查\b所在的位置是否是单词边界

单词边界 --- 字符串开头,字符串结尾,空白,标点符号等

匹配一个长度是4的字符串,第一个是任意字符,后边是adc;检查c的后面是否是单词边界
re_str = r'.adc\b'
print(re.fullmatch(re_str,'2adc'))
^(检查是否是字符串开头)
re_str = r'^adc'
print(re.fullmatch(re_str,'adc'))

print(re.search(r'^\d\d','as12dad'))
$(检测是否是字符串结尾)
re_str = r'^adc$'
print(re.search(r'\d\d$','as12dad'))
3.转义字符

1.转义符号:再有特殊功能、意义的符号前加‘\’,让这个正则符号变成普通符号

注意:在[]中只要不把^放在开头或者把-放在字符之间,在[]里面的字符全都可以用


re_str = r'\d\d\.\d\d'
print(re.fullmatch(re_str,'12.33'))
4.匹配次数
    1. *(匹配0次或者多次)

字符* -- 指定的字符出现0次或者多次
a* --- 字符a匹配0次或者多个
\d* --- 数字匹配0次或者多次
[a-z]* -- 小写字母匹配0次或者多次

re_str = r'a*bc'
print(re.fullmatch(re_str,'adc'))
print(re.fullmatch(re_str,'aadc'))
    1. +(匹配1次或者多次)
re_str = r'a\d+b'
 # r'a\d+b'=r'a\d\d*b'
print(re.fullmatch(re_str,'a1b'))
3) ?(0次或者1次)
练习:写一个整数,能够匹配一个整数字符串
re_str = r'[-+]?\d+'
4) {}
{N}   -- 匹配N次
{M,N}  -- 匹配至少M次,最多N次
{M,}   --匹配至少M次
{,N}   --匹配最多N次
*  === {0,}
+ === {1,}
?  =={0,1}
5)非贪婪
贪婪   --- 匹配次数不确定的时候尽可能多的匹配(上面此时不确定的符号都是贪婪)
非贪婪 --- 匹配次数不确定的时候尽可能少的匹配(上面次数不确定的符号后面加?就会变成非贪婪)
*?  ---  0次或多次,尽可能少
+?  --  1次或多次,尽可能少
??  -- 0次或1次,尽可能少
{M,N}?
{M,}?
{,N}?
re_str = r'a+'
print(re.search(re_str,'baaaac'))

re_str = r'\d{2}'
print(re.fullmatch(re_str,'12'))

re_str = r'\d{2,4}'
print(re.fullmatch(re_str,'12'))


re_str = r'[adc]{,4}'
print(re.fullmatch(re_str,'a'))
练习:写一个正则表达式判断密码是否符合要求:密码有数字和字母组成,并第一个字符是大写字母,长度是6-12位
re_str = r'[A-Z][0-9a-zA-Z]{5,11}'
5.分之和分组
|(分之)

正则1|正则2 --先用正则1匹配,如果匹配失败就用正则2匹配(正则1和正则2只要有一个匹配成功就成功,两个失败才会失败,
如果正则1成功不会匹配正则2)

匹配一个字符串,开头是abc或者xyz,后面是123
'abc','xyz'
re_str = r'abc|xyz'
print(re.fullmatch(re_str,'abc'))
print('===========')
re_str = r'\d{3}|[a-zA-Z]|\+{3}'
print(re.fullmatch(re_str,'a'))
2)() -- 分组

将部分正则作为一个整体

  • 1.整体区分
    result = r'(xxx|yyy)123'
  • 2.整体操作
    re_str = r'(\d{2}[a-z]{2}){3}'
  • 3.整体重复
    \m ---重复前面第m个分组匹配到的内容
re_str = r'(xxx|yyy)123'
print(re.fullmatch(re_str,'xxx123'))
re_str = r'(\d{2}[a-z]{2}){3}'

# 20abc20
re_str = r'(\d\d)abc\1'
# \1表示重复的第一个分组的内容

三 正则的应用

1.(了解)compile (正则表达式)-- 创建正则表达式对象

re_str = r'\d{3}'

2.fullmatch ---完全匹配

fullmatch(正则表达式,字符串) --- 让正则和字符串完全匹配;匹配失败返回None,匹配成功返回匹配对象

对整个字符串进行检查的时候使用,比如:判断账号密码是否合法,手机号,邮箱是否合法等

result = fullmatch(r'\d{3}[a-z]{2}[A-Z]{3}','123qwQWE')
print(result)
match ----匹配字符串开头

match(正则表达式,字符串) --- 让正则和字符串开头匹配;匹配失败返回None,匹配成功返回匹配对象

result = match(r'\d{3}','123asda')
print(result)
4.search -- 字符串查找

search(正则表达式,字符转)--- 在字符串中找到第一个和正则表达式匹配的子串,没有匹配到返回None。匹配到了返回对象

result = search(r'(\d{3})([A-Z]{2})','asrd122ASasd2391a')
print(result)
通过匹配对象能获得以下内容
# a.匹配结果
print(result.group())   # 获取整个正则匹配到的结果
print(result.group(1))  # 获取第一个分组匹配到的结果

# b.匹配范围(被匹配到的内容在原字符中的范围)   -(开始下标,结束下标)
print(result.span())
print(result.start())
print(result.end())

# c 获取原字符串
result .string
5.split --- 字符串切割

split(正则表达式,字符串,切割次数) --- 加个字符串按照满足正则表达式的子串切割;返回的是一个列表,列表中是被切开的子串

切割次数 -- 不传参就全切

print(split(r'\d+|[A-Z]+','dasdqA2eedadZq1ad12D1adasdadqwd'))
#['dasdq', '', 'eedad', 'q', 'ad', '', '', 'adasdadqwd']
6.sub -- 字符串替换

sub(正则表达式,新的字符串,原字符串,替换次数) --- 将原字符串中满足正则表达式的子串换成新字符串
替换次数 -- 不穿参就全部替换

print(sub(r'\d+','*','asd32dsdfswfsf422dsds2wd2d'))
# asd*dsdfswfsf*dsds*wd*d

findall --- 查找所有

findall(正则表达式,字符串) ---- 在字符串中查找所有满足正则表达式的子串,以列表的形式返回

print(findall(r'\d+a','212asdad1dasd3adad3321da'))
#  ['212a', '3a']
如果有分组 ,只取分组中的内容
print(findall(r'(\d+)a','212asdad1dasd3adad3321da'))
# ['212', '3']

注意:使用findall的时候,如果有分组想要取整个正则匹配的结果是取不到的

8.finditer -- 查找所有

finditer(正则表达式,字符串) ---- 在字符串中查找所有满足正则表达式的子串,返回一个迭代器,元素是每个子串对应的匹配对象

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

推荐阅读更多精彩内容

  • 1.什么是正则表达式正则表达式就是字符匹配的工具;是由正则符号和普通字符组成,来匹配不同规律的字符串 2.Pyth...
    哗啦噼里啪啦阅读 351评论 0 0
  • 1.什么是正则表达式(语法通用) 正则就是一种用来做字符串匹配的工具,通过不同的符号匹配不同的字符 2.pytho...
    LitoYu阅读 304评论 0 0
  • 1.正则表达式 1.什么是正则表达式(语法通用) 正则就是一种用来做字符串匹配的工具,通过不同的符号匹配不同的字符...
    ychaochaochao阅读 454评论 0 0
  • 1.什么是正则表达式(通用)正则就是一种用来做字符串匹配的工具,通过不同的符号匹配不同的字符 2.python对正...
    哗啦噼里啪啦阅读 237评论 0 0
  • 一、匹配字符 1.什么是正则表达式(语法通用)定义:一种用来做字符串匹配的工具,通过不同的符号匹配不同的字符 2....
    两只小猪呼噜噜_1539阅读 210评论 0 4