day18正则表达式

1.正则表达式语法

1.什么是正则表达式
用来匹配或者描述字符串的工具。

用处:
a.判断输入的字符串(是否满足某个条件)是否是邮箱/手机号码。是否是ip地址
b.提取满足条件的字符串
c.字符串替换

python中通过re模块中相应的方法来支持正则表达式的匹配、查找、替换等功能

fullmatch(正则表达式,字符串)---> 判断正则表达式和字符串是否完全匹配
正则表达式:就是一个字符串,字符串中是正则表达式语法。r'正则表达式'
正则表达式中包含两个部分,一个是正则语法对应的字符,一个是普通字符

from re import fullmatch
# ----------------------------1. 点-----------------------------------------
"""
 .   匹配任意字符。 一个 . 只匹配一个字符
"""
# 匹配一个长度是 3 的字符串,第一个字符是a,第二个字符是任意字符,第三个字符是b
re_str = r'a.b'
result = fullmatch(re_str,r'a\b')
print(result)
# 匹配一个长度是4 ,第一个和最后一个字符是ab 中间两个字符是任意字符的字符串
re_str = r'a..b'
result = fullmatch(re_str,'a11b')

# --------------------------------2. \w---------------------------------
"""
一个\w只能匹配一个字符
"""
# 匹配一个第一个字符是数字字母下划线,后面三各字符是任意字符的字符串
re_str = r'\w...'
result = fullmatch(re_str,'_qqq')
print(result)

# -------------------------------3. \s ------------------------------------
"""
匹配任意空白字符 \s
空白字符指的: 空格 、制表符(Tab缩进)、回车等。都属于空白字符
一个\s 匹配一个空白字符
"""
re_str = r'a\sb'
result = fullmatch(re_str,'a\rb')# \n 是等于换行  \t 制表符 \r等于回车
print(result)

# ------------------------------ 4.\d 匹配数字-----------------------------------

re_str = r'\d\d\d\d'
result = fullmatch(re_str,'1234')
print(result)

# -----------------------------5. \b 检测边界------------------------------------
"""
\b 一个 \b 不会去匹配一个字符,而是单纯的检测 \b 出现的位置是否是单词边界
单词边界:字符串开始和结尾、空格、换行、标点符号等,能将单词隔开的字符
"""
re_str = r'\babc'
re_str = r'abc\b.bbb' # 配一个字符串前三位是abc 第四位是空白 并且要求c的后面是单词边界
result = fullmatch(re_str,'abc bbb')
print(result)
# ----------------------------6 ^ 检测是否是字符串开头------------------------------
"""
^  
"""
re_str = r'^\d\d\d' # 判断一个字符串是否是三各数字开头
result = fullmatch(re_str,'123')
print(result)

# ---------------------------------7 $ 检测是否是字符串结尾---------------------------
re_str = r'abc$'
result = fullmatch(re_str,'abc')
print(result)
# --------------------------------8 \W 匹配非字母数字下划线----------------------------
re_str = r'\Wabc'
result = fullmatch(re_str,'@abc')
print(result)
#-----------------------------------9 \S  匹配非空白字符--------------------------------
re_str = r'\S....'
result = fullmatch(re_str,'12345')
print(result)
# --------------------------------10 \D 匹配非数字字符----------------------------------
re_str = r'\D\d\s'
result=fullmatch(re_str,'n2 ')
print(result)
#------------------------------------11 \B 检测是否不是单词边界--------------------------
re_str = r'and\Byou'
result = fullmatch(re_str,'andyou')
print(result)
# -------------------------------------12 [] 匹配中括号中出现的任意一个字符-----------------------
"""
一个[](中括号中是字符集)匹配一个字符 只要匹配到中括号中其中一个字符就行

"""
re_str = r'[abc]aaa'# 匹配一个字符串第一个字符是a或b或c的字符
result = fullmatch(re_str,'aaaa')
print(result)
# ------------------------------------13 [n-m] 匹配n到m中的任意一个字符------------------------
"""
'-' 减号在括号中,如果放在两个字符中间表示范围。也可以用unicode编码
字符n要小于字符m 跟据unicode编码前后
"""
re_str = r'[1-9]\w.'
result = fullmatch(re_str,'1_黑')
print(result)

# 匹配一个字符是字母数字下划线或者是空白
re_str = r'[\w\s]'
result = fullmatch(re_str,'w')
print(result)
# ------------------------------------ 13 [^]  匹配一个不再字符集中的任意字符------------------------------------
"""
[^] ^ 必须放在中括号里的最前面才有效
"""
re_str = r'[^abc]...' # 匹配第一位不是abc中的任何一个的字符串
result = fullmatch(re_str,'sos!')
print(result)

2.正则表达式相关符号

from re import fullmatch

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

字符*(字符可以是符号也可以是具体字符)--->字符出现0次或者多次

# 匹配0位或者多位的数字字符串
re_str = r'\d*'
print(fullmatch(re_str,'123'))
# 用一个正则表达式来检测一个标识符是否符合要求
# re_str= r'[^0-9]\w*'
re_str = r'[a-zA-Z_]\w*'
print(fullmatch(re_str,'asw_esde'))

2 + (匹配一次或者多次)
字符 + ---> 字符至少有一个或者多个

re_str = r'\d+abc'# 匹配前面一个或者多个数字 后面三各字符是abc
print(fullmatch(re_str,'1213123abc'))
  1. ? (匹配0次或者1次)

字符 ?

#练习: 写一个正则表达式,匹配所有的整数(123,-2334,+9)
re_str = r'[-+]?[1-9]\d*'
print(fullmatch(re_str,'12'))
  1. {}(指定次数)

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

re_str = r'\d{4,}'
print(fullmatch(re_str,'12345'))
re_str = r'[a-z]{4,6}'  # 设置 4到6位的字母密码
print(fullmatch(re_str,'asdwe'))

# 设置一个由数字字母组成的6-16位密码
re_str = r'[\dA-Za-z]{6,16}'
print(fullmatch(re_str,'python1807'))

3.分支和分组

  1. 分之 |

条件1 | 条件2 ---> 先用个条件1匹配,如果匹配成功就提前匹配成功,并且不会匹配条件2。如果条件1匹配失败,就用
条件2匹配,如果两个都失败就匹配失败

import re
re_str = r'[a-z]{3}|[A-Z]{3}' # 竖线两边的条件独立 。这里时候三各小写或者三个大写。不可大小写混合

re_str = r'a|bsd|aaa'
print(re.fullmatch(re_str,'bsd'))
  1. () (分组)
    a.组合(将括号中的内容作为一个整体进行操作)
    b.捕获 ----> 使用带括号的正则表达式匹配成功后,只获取括号中的内容
    c.重复---->在正则表达式中可以通过 \数字 来重复前面括号()中匹配到的结果
    数字代表的是前面第几个括号,而不是重复次数。
# 组合
# 匹配一个字符串以数字字母组合形式出现3次
re_str = r'((\d[a-zA-Z]){3})'
print(re.fullmatch(re_str,'2k3k4l'))

# 捕获
re_str = r'\d{3}abc'
print(re.findall(re_str,'adas123abc3233abc3e3ad1123abc'))
# findall 先匹配成功后只获取括号里面的内容!

# 重复
re_str = r'([a-z]{3})-(\d{3}\1\2)'
  1. 转义符号
    正则表达式中可以通过在特殊的符号前加 \ 来让特殊的符号没有意义
    . ---> 任意字符 \ .---> 字符 .
  • ---> 匹配一次或多次 + ---> 字符 +
    注意:在中括号中的特殊符号,只能表示它本身
    \ 不管在哪都需要转义。 \ 才能表示 \
  • 在[]外面没有特殊意义,要在中括号中表示它本身,不能放在两个字符中间
    ()也需要转义
re_str = r'\d*[555]'
print(re.fullmatch(re_str,'12334555555555'))

4.re模块中函数

  1. compile
    compile(正则表达式字符串)---> 将正则表达式字符串转换成正则表达式对象
import re
re_object = re.compile(r'\d+')
print(re_object)

2.fullmatch 和 match

fullmatch(正则表达式字符串,需要去匹配的字符串)--->用正则表达式去完全匹配字符串。匹配整个字符串
返回匹配对象或者None

match(正则表达式字符串,字符串)--> 不完全匹配。匹配字符串开头,返回匹配对象或者None

result = re.fullmatch(r'\d[a-zA-Z]+','3WEEA')
print(result)
# 结果 1.span ---> 获取匹配成功的开始下标和结束下标区间(开区间)
print(result.span())
print(result.start(0))#获取匹配到的开始下标

2.group---> 获取匹配结果
print(result.group())

group() / group(0) ---> 获取正则表达式完全匹配的结果
group(index>0)--> 正则表达式中第index个分租匹配到的结果

print(re.findall(r'\d[a-zA-Z]+','3WEEAASSAD3dddd'))

3.search

result = re.search(r'(\d)[a-zA-Z]+')

"""
search (正则表达式,字符串)
--->查找字符串中满足正则表达式的第一个字符串,返回值是匹配对象或者None

# 用search匹配出一个字符串中所有的数字字符串
#'abc34sda8923asdad9asda890sd'--->
result = r'\d+'
print(re.findall(result,'abc34sda8923asdad9asda890sd'))

4.findall

findall(正则表达式,字符串)---> 获取字符串中满足正则表达式的所有字串,返回一个列表
注意: 如果正则表达式中国有分组,取值的时候只取括号分组里面匹配的内容
如果有多个分组,就将每个分组匹配到的结果作为一个元组的元素

result = r'(\d+)k([a-dA-D]+)'
print(re.findall(result,'abc34sda8923kasdad9asda890kbcsd'))
  1. finditer
    finiter(正则表达式,字符串)
    查找所有满足正则条件的子串,返回值是迭代器,并且迭代器里面的元素是匹配对象
re_str = r'\d+'
str1 = 'abc34kshd8923kabcshd9lkkk890kaa'
result = re.finditer(re_str, str1)
print(result)
for item in result:
    print(item)
  1. split

split(正则表达式,字符串) --> 将字符串按照满足正则表达式条件的子串进行分割

str1 = 'ahsb1sssa8-jjhd7nhs+90nsjhf3-4hhh7+8kjj-'
result = re.split(r'[-+]', str1)
print(result)

7.sub

sub(正则表达式,repl,字符串) --> 将字符串中满足正则表达式条件的子串替换成repl。返回替换后的字符串

str1 = 'hsj8jskfh98ssjj8hshh'
result = re.sub(r'\d+','*', str1)
print(result)

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

推荐阅读更多精彩内容

  • 每天大约10:30左右睡觉6点钟起床,基本做到早睡早起,可能距离4点起21点睡还有一定差距。每天规定的一堂口语课和...
    srainz阅读 142评论 0 0
  • 生活中,经常会遇到这样一种人:宁愿饿肚子,或者借钱也要买名牌,用名牌符号装饰自己。 1、 萍萍姐,打小就长得好看,...
    叶芬阅读 2,725评论 5 15
  • 百日营快过去一个月啦,在这一个月里除了每周的大课和周末分享,每日陪伴式的成长、习惯的养成和不一样的三十一天,每位小...
    粉水晶女孩阅读 74评论 0 0
  • 小米失恋了,这一次,是男方提的分手。 女生说分手不过想换一个挽留,而男生说分手真的就是要离开了。 分手的结局很像电...
    海边的椰子阅读 225评论 0 0