正则概念
就其本质而言,正则表达式(或re)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过re模块实现。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行
初入正则,re.findall()与元字符
# findall(): 去字符串中把我所有匹配到的结果,以列表形式列出 r = re.findall(‘alex‘,‘xxfsafasdf$alexxxxalex‘) # | | # 匹配规则 需要匹配结果的字符串 print(r) ==> [‘alex‘, ‘alex‘] # 以上我们使用的是普通字符做规则去匹配字符串, # 而正则就是要更灵活的匹配字符串,所以,这里要引出一个概念: # 原字符 # . (小数点) # 匹配除换行符以外的任何一个字符 >>> re.findall(‘al.x‘,‘xxfsafasdf$alexxxxalwx‘) [‘alex‘, ‘alwx‘] # ^ (以什么开头) # $ (结尾符) >>> re.findall(‘^al.x‘,‘alexxxfsafasdfalexxxxalwx‘) [‘alex‘] # 仅匹配到开头的alex >>> re.findall(‘al.x$‘,‘alexxxfsafasdfalexxxxalwx‘) [‘alwx‘] # 匹配字符串到结尾 # * (0-多次重复) >>> re.findall(‘alex*‘,‘alexxxfsafasdfalexxxxale‘) [‘alexxx‘, ‘alexxxx‘, ‘ale‘] # 匹配到0-多次重复的x # .* (1-多个任意字符) >>> re.findall(‘f.*fale‘,‘alexxxfsafasdfalexxxxalwx‘) [‘fsafasdfale‘] # + (1-多次重复) >>> re.findall(‘alex+‘,‘alexxxfsafasdf$alexxxxale‘) [‘alexxx‘, ‘alexxxx‘] # .+ (2-多个任意字符) >>> re.findall(‘alex+‘,‘alex‘) [‘alex‘] >>> re.findall(‘alex.+‘,‘alex‘) [] # .? (匹配0或1此重复) >>> re.findall(‘ale.?‘,‘alex‘) [‘alex‘] >>> re.findall(‘ale.?‘,‘ale‘) [‘ale‘] # {} (匹配范围) >>> re.findall(‘ale{2}x‘,‘alexaleex‘) # 匹配2次重复 [‘aleex‘] >>> re.findall(‘ale{2,3}x‘,‘alexaleexaleeex‘) # 匹配2到3次重复 [‘aleex‘, ‘aleeex‘] >>> re.findall(‘ale.{2,7}x‘,‘alexaleexaleeexalesddsx‘) # 同样适用.{}匹配任意字符 [‘alexaleex‘, ‘aleeex‘, ‘alesddsx‘]
# [bc] 匹配b或c >>> re.findall(‘a[bc]c‘,‘abcacc‘) [‘abc‘, ‘acc‘] # [a-z] 范围匹配,a-z任意一个字母 [1-9] 匹配1-9任意一个数字 >>> re.findall(‘a[a-z]c‘,‘abcacc26862‘) [‘abc‘, ‘acc‘] >>> re.findall(‘[1-9]‘,‘abcacc26862‘) # 取到了每一个数字 [‘2‘, ‘6‘, ‘8‘, ‘6‘, ‘2‘] # [a*] 匹配a或*(*在中括号中无意义) >>> re.findall(‘a[b*]c‘,‘abca*c‘) [‘abc‘, ‘a*c‘] # [^f] 取反,不包含f匹配 >>> re.findall(‘a[^f]c‘,‘abca*c‘) [‘abc‘, ‘a*c‘]
正则之反斜杠使用
# 反斜杠后边跟元字符去除特殊功能 # 反斜杠后边跟普通字符实现特殊功能 \d 匹配到任何十进制数;它相当于[0-9] \D 匹配任何非数字字符;它相当于[^0-9] \s 匹配任何空白字符;它相当于[ \t\n\r\f\v] 注意第一个字符为空格 \S 匹配任何非空白字符;它相当于[^ \t\n\r\f\v] 注意第二个字符为空格 \w 匹配任何字母数字字符;它相当于[a-zA-Z0-9_] 注意包含下划线 \W 匹配任何非字母数字字符;它相当于[^a-zA-Z0-9_] 注意包含下划线 \b 匹配一个单词的边界,也就是指单词和空格间的位置 匹配单词边界(包含开始和结束),这里的“单词”,是指连续的字母、数字和下划线组成的字符串 \b定义的是\w和\W的交界,这是个零宽界定符(zero-width assertions)只用以匹配单词的词首和词尾。单词被定义为一个字母数字序列,因此词尾就是用空白符或非字母数字符来标示的 # \b 实例 >>> re.findall(‘i‘,‘i am handisome‘) [‘i‘, ‘i‘] # 普通匹配会这样匹配每一个i,但是我现在只想匹配单词‘i’ >>> re.findall(r‘i\b‘,‘i am handisome‘) # r为原始字符串使用,下面有介绍 [‘i‘] # 这样我只会匹配到单词i # 不只是空格,上边定义是\w和\W的交界,也就是说我的特殊字符也属于这个交界,例如 >>> re.findall(r‘i\b‘,‘i&am handisome‘) [‘i‘] # &符号也会被\b所匹配到
re.match()
# match 匹配字符串起始位置 # 仅匹配起始位置,后边有符合匹配也不会匹配 >>> r = re.match(‘com‘, ‘comwww.runcomoob‘) >>> r.group() ‘com‘ >>> r = re.match(‘com‘, ‘www.runcomoob‘) # 同样包含com但是不是起始位置不匹配 >>> print(r) # 因为不匹配,所以r就是一个None值 None # re.match返回的是match的一个对象结果 >>> r = re.match(‘com‘, ‘comwww.runcomoob‘) <_sre.SRE_Match object; span=(0, 3), match=‘com‘> # match对象拥有以下几个方法 # group() 返回被re匹配到的字符串 >>> r.group() # group方法拿这个对象值 ‘com‘ # start() 返回匹配开始的位置 >>> r.start() 0 # end() 返回匹配结束的位置 >>> r.end() 3 # span() 返回一个元祖包含匹配(开始,结束)的位置 >>> r.span() (0, 3)
re.search()
# search()找到第一个匹配的字符串 # search同样返回一个match对象 >>> r = re.search(‘com‘, ‘www.rcomuncomoob‘) # 我有两个com >>> r.group() ‘com‘ >>> r <_sre.SRE_Match object; span=(5, 8), match=‘com‘> # 仅匹配到第1个com
re.sub()
# re.sub() 替换方法 # re.sub(pattern,repl,string,max) # 将string字符串中匹配pattern的字符串替换为repl # max为最大替换数 >>> re.sub("g.t",‘have‘, ‘i get a, i got b , i gut c‘) ‘i have a, i have b , i have c‘ >>> re.sub("g.t",‘have‘, ‘i get a, i got b , i gut c‘,2 ) #指定最大替换为2 ‘i have a, i have b , i gut c‘ # re.subn() 同样为替换 >>> re.subn("g.t",‘have‘, ‘i get a, i got b , i gut c‘ ) (‘i have a, i have b , i have c‘, 3) >>> re.subn("g.t",‘have‘, ‘i get a, i got b , i gut c‘,2 ) (‘i have a, i have b , i gut c‘, 2) # 对比sub,它输出为元祖有两个元素,第一修改后字符串,第二是修改次数
re.split()
# split切割字符串 >>> re.split(‘\d+‘,‘one1two2three3four4‘) # \d+ 等于[1-9]+, 1个到多个数字,按数字切割此字符串 [‘one‘, ‘two‘, ‘three‘, ‘four‘, ‘‘] # 注意 , 我最后4切割完成后,还保留了一个空字符串为一个元素输出了
re.compile()
# 是将你需要匹配的规则封装为一个对象,然后直接使用这个对象调用findall、search等等匹配字符串 >>> text = "i am handsome" # 这是我要去匹配的字符串 >>> regex = re.compile(r‘i\b‘) # 这是我要匹配字符串的规则,封装为compile对象 >>> print(regex.findall(text)) # 我直接使用我封装好的compile对象去字符串匹配 [‘i‘]
正则之原生字符串
>>> re.search(r‘\\‘,‘www\www‘).group() ‘\\‘ # 我们拿\\去后边字符串匹配,匹配到了,但是我们后边字符串并没有\\ # 这是因为,正则本身就是一个语言,在后边字符串输入,只是提供给正则 # 正则当处理我们数据后,返回给python,因为\有特殊予以,所以返回 # python时又转译了字符串
时间: 2024-09-29 22:17:28