Python学习笔记之正则表达式基本知识

时间:2021-11-18 10:12:52

正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的

  1. 一般字符串
#encoding=utf-8
import re

# 1 '.'匹配任意字符除了换行字符"\n"

pattern=re.compile(r"abc.d")
macth=pattern.match("abc1d")
print macth.string #输出abc1d

#2 '\'转移字符 .在正则表达式中任意
pattern1=re.compile(r"ab\.d")
macth1=pattern1.match("ab.d")
print macth1.string #ab.d

#3 [...]字符集
# [a-z][A-Z][0-9] 分别代表 全部26个大小写英文字母和数字

pattern2=re.compile(r"[abc]")
macth2=pattern2.match("ab")
print macth2.string #ab



2.预定义字符集(可以写成[……])

#encoding=utf-8
import re

#\d数字[0-9]

pattern=re.compile(r"\d")

macth=pattern.match("123567")

print macth.group() #1


#\D 非数字:[^\d]

pattern=re.compile(r"\D")
macth=pattern.match("w")
print macth.group() #w

#\s 空白字符 [<空格>\t\r\n\f\v]

pattern=re.compile(r"a\sb")
macth=pattern.match("a b")
print macth.group() #a b

#\S 非空白字符 [^\s]

pattern=re.compile(r"a\Sb")
macth=pattern.match("acb")
print macth.group() #acb

#\w 单词字符[a-z][A-Z][0-9]
pattern=re.compile(r"a\wb")
macth=pattern.match("a2b")
print macth.group() #a2b

#\W 非单词字符
pattern=re.compile(r"a\Wb")
macth=pattern.match("a b")
print macth.group() #a b

3.数量词

#encoding=utf-8
import re

(1)#'*'匹配前一个字符 0次或者无限次

pattern=re.compile(r"abc*")
match=pattern.match("ab")
print match.group()#ab

match=pattern.match("abccb")
print match.group()#abcc

(2)#'+'匹配前一个字符 1次或者无限次
pattern=re.compile(r"abc+")
match=pattern.match("abccb")
print match.group()#abcc


(3)#'?'匹配前一个字符 0次或者1次
pattern=re.compile(r"abm?")
match=pattern.match("abmm")
print match.group()#abm

(4)#{m}匹配前一个字符 m次

pattern=re.compile(r"abm{3}")
match=pattern.match("abmmm")
print match.group()#abmmm

(5)#{m,n}匹配前一个字符 m~n次 m和n可以省掉,m省掉就是0~n次,n省掉m~无限次

pattern=re.compile(r"ab1{2,}")
match=pattern.match("ab11111")
print match.group()#ab11111

4.边界匹配

#encoding=utf-8
import re

#'^'匹配字符串的开头 多行模式下每行的开头

pattern=re.compile(r"^ab")

match=pattern.match("abc")

print match.group() #ab

#'$'匹配字符串的结束 多行模式下每行的结束

pattern=re.compile(r"abc$")

match=pattern.match("abc")

print match.group() #abc


#'\A' 仅仅匹配以字符开头的

pattern=re.compile(r"\Aabc")

match=pattern.match("abc")

print match.group() #abc


#'\Z' 仅仅匹配以字符开头的

pattern=re.compile(r"abc\Z")

match=pattern.match("abc")

print match.group() #abc


#'\b' 匹配\w和\W之间

pattern=re.compile(r"a\b!bc")

match=pattern.match("a!bc")

print match.group() #a!bc

#'\B' [^\b]
pattern=re.compile(r"a\Bbc")

match=pattern.match("abc")

print match.group() #abc

5.逻辑分组

#encoding=utf-8
import re

#'|' 代表左右表达公式任意匹配一个
#它总是先匹配左边,如果匹配成功就跳过右边
#如果|没被()包括默认是整个表达式

pattern=re.compile(r"abc|bcd")
macth=pattern.match("abc")
print macth.group() #abc

#(...)
#被括号扩起来的表达式作为分组,从表达式左侧开始每遇到分组( 编号+1
#分组表达式作为一个整体,后边可以跟量词,表达式中的|仅仅在改组中有效
pattern=re.compile(r"(abc|vbs)*")
macth=pattern.match("abcabc")
print macth.group() #abc

#(?p<name>...)
#分组除了原有的编号之外,额外制定也给别名

pattern=re.compile(r"(?P<zhang>abc)*")
macth=pattern.match("abcabc")
print macth.group() #abc


#\<number> 应用编号为number到规则表达式中

pattern=re.compile(r"(abc)2\1")
macth=pattern.match("abc2abc")
print macth.group() #abc2abc


#(?P=name) 引用别名为name到表达式中

pattern=re.compile(r"(?P<zhang>abc)2(?P=zhang)")
macth=pattern.match("abc2abc")
print macth.group() #abc2abc

6.re.match()

#encoding=utf-8
import re

m=re.match(r"(\w+) (\w+)(?P<zhang>.*)","hello world!")
#匹配时使用的文本。hello world!
print m.string


#匹配时使用的Pattern对象。<_sre.SRE_Pattern object at 0x10c915690>
print m.re

#文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同
print m.pos #0

#文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
print m.endpos #14

#最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。
print m.lastindex #3

#最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。
print m.lastgroup #zhang


#获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。
# group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时,
# 返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串
print m.group(1,2) #('hello', 'world')

#以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。
# default表示没有截获字符串的组以这个值替代,默认为None。
print m.groups() #('hello', 'world', '\xef\xbc\x81')


#返回以有别名的组的别名为键、以该组截获的子串为值的字典,
# 没有别名的组不包含在内。default含义同上。
print m.groupdict() #{'zhang': '\xef\xbc\x81'}

#返回指定的组截获的子串在string中的起始索引(子串第一个字符的索引)。group默认值为0。
print m.start(2) #6

#返回指定的组截获的子串在string中的结束索引(子串最后一个字符的索引+1)。group默认值为0。
print m.end(1)#5


#返回(start(group), end(group))。
print m.span(2)#(6, 11)

#将匹配到的分组代入template中然后返回。template中可以使用\id或\g<id>、\g<name>引用分组,但不能使用编号0。
# \id与\g<id>是等价的;但\10将被认为是第10个分组,如果你想表达\1之后是字符'0',只能使用\g<1>0。
print m.expand(r"\g<2> \g<1>\3") #world hello!