阅读裘宗燕老师的《数据结构与算法:python语言描述》的课件所记笔记

四、正则表达式:

1.原始字符串:

  • 在普通字符串前加r或R前缀,如r"abadef", R"c:\text\x"
  • 原始字符串中的\不作为转义符
  • 为了使一些字符串写法简单

2.元字符:

  • . ^ $ * + ? \ | { } [ ] ( )

3.正则表达式对象:

  • 通过re.compile(pattern, flag = 0)从pattern生成正则表达式对象,例如r1 = re.compile("abc"),将生成的正则表达式对象赋给变量r1
  • 避免在重复使用中重复生成

4.正则表达式函数

  • re.search(pattern, string, flag=0)
    在string里检索与pattern匹配的子串,找到就返回一个match类型的对象,没有就返回None,match记录成功匹配的相关信息,可把它作为一个真值用于逻辑判断
  • re.match(pattern, string, flag=0)
    检查string中是否有与pattern匹配的前缀,成功返回match对象,否则返回None
  • re.split(pattern, string, maxsplit=0, flags=0)
    以pattern作为分割串将string分段,maxsplit指明分割数,0表示做完整个string。返回分割得到的字符串表。
    >>> re.split(' ', "abc abb are not the same")
    >>> ['abc', 'abb', 'are', 'not', 'the', 'same']
    >>> re.split(' ', "1 2  3  4 ")
    >>> ['1', '2', '', '3', '', '4', '']
  • re.findall(pattern, string, flags=0)
    返回一个表,按顺序给出string里与pattern匹配的各个子串

5.pattern模式

  • 字符组表达式[...],匹配括号中的任一个字符
    [abc]:匹配a或b或c
    区间形式[0-9]:顺序列出的缩写,匹配所有十进制数字字符
    [0-9a-zA-Z]:匹配所有字母(英文)和数字
  • 求补表达式[^...],匹配未在括号里列出的字符
    [^0-9]:匹配所有非十进制数字的字符
    [^ \t\v\n\f\r]:匹配所有非空白字符(非空格/制表符/换行符)
  • 圆点字符.:匹配任意一个字符
    a..b:匹配所有以a开头b结束的四字符串
  • 重复运算符*a*表示匹配a的0次或任意多次出现
    >>> re.split['[ ,]*', '1 2, 3   4, , 5']
    >>> ['1', '2', '3', '4', '5']
  • 重复运算符+,表示1次或多次重复。*略微不同
    例如'\d+'等价于'\d\d*'
  • 可选(片段)用?运算符表示
    ?表示0次或1次重复,例如描述整数的一种简单模式'-?\d+'
  • 确定次数的重复用{n}表示,a{n}与a的n次重复串匹配
    例如描述北京的常规号码:'(010-)?[2-9][0-9]{7}'
  • 上述的圆括号是描述?的作用范围
    *,?,{n}有作用范围问题(优先级),它们作用于最小表达式,'010-?'表示-可选,'(010-)?'表示整个段可选
  • 重复范围用{m,n}表示,a{m,n}表示匹配m到n个a的串
    a{3,7}与3到7个a构成的串匹配
    其中m和n均可以省略,a{,n}表示a{0,n}a{m,}表示a{m,inifinity}
    a{n}等价于a{n,n}a?等价于a{0,1}a*等价于a{0,inifinity)a+等价于a{1,inifinity}
  • 选择运算符|描述两种或多种情况之一的匹配,如果a或b与一个串匹配,那么a|b就与之匹配
    a|b|c可以匹配a或b或c,[abc]可看作其简写
  • 行首匹配:以^符号开头的模式,只能与一行的前缀子串匹配
    re.search('^for', 'books for children')得到None
  • 行尾匹配:以$符号结尾的模式,只能与一行的后缀子串匹配
    re.search('fisth$', 'cats like to eat fishes')得到None
  • 注意,“一行的”前缀/后缀包括整个被匹配串的前缀和后缀
    如果串里有换行符,还包括换行符钱的子串(一行的后缀)和其后的子串(前缀)
    串首匹配:\A开头的模式只与被匹配串的前缀匹配
    串尾匹配:\Z结束的模式只与被匹配串的后缀匹配
  • 贪婪匹配与非贪婪匹配
    * + ? {m,n}都采取贪婪匹配策略,与被匹配串中最长的合适子串匹配
    *? +? ?? {m,n}?个运算符后加一个问号,采用分贪婪匹配(最小匹配)
  • 如果要在字符组里包括^,就不能放在第一个位置,或者写成\^,同理- ],也要写成\-\]
  • 为了方便,re用转义形式定义了一些常用字符组
    \d:等价于[0-9]
    \D:等价于[^0-9]
    \s:等价于[ \t\v\n\f\r]
    \S:等价于[^ \t\v\n\f\t]
    \w:等价于[0-9a-zA-Z]
    \W:等价于[^0-9a-zA-Z]

6.组(group)

  • 圆括号阔起的模式段(...)也是模式,同时还确定了一个被匹配的‘组’(字符段),该组可在后面使用,要求匹配同样字符串
  • 可用\n形式在模式里’引用‘组,组从1开始编号
    例如r'(.{2} \1'可匹配’ok ok‘或’no no‘,不匹配’no oh‘,\1要写成\1`或使用原始字符串形式

7.其他匹配操作

  • re.fullmatch(pattern, string, flags=0)
    若整个string与pattern匹配成功将返回相应的match对象,否则返回None
  • re.finditer(pattern, string, flags=0)
    与findall类似,但返回的不是表而是一个迭代器,使用该迭代器可顺序取得表示各非重叠匹配的match对象
  • re.sub(pattern, repl, string, count=0, flags=0)
    做替换,把string里顺序与pattern匹配的各非重叠子串用repl代换。repl是串则直接代换,同时repl还可以是以match对象为参数的函数,这时用函数的返回值代换被匹配子串
    例如把串text里的\t都代换为4个空格,re.sub('\t', ' ', text)

8.匹配对象(match对象操作)

  • 假设mat表示通过匹配得到的一个match对象,mat可用于逻辑判断
  • 取得被匹配的子串:mat.group()
  • 在目标串中的匹配位置:
    mat.start()得到成功匹配在目标串里的实际匹配位置,mat.end()表示被匹配子串的结束位置
    假设text是目标串,则mat.group() == text[mat.start():mat.end()]
  • 目标串里被匹配的区间:mat.span()
    得到匹配开始和结束位置形成的二元组,mat.span() == mat.start(), mat.end()

9.正则表达式对象

正则表达式对象支持一组方法,与直接使用re.xxx形式相比较,这组方法功能更多,使用更灵活。假设regex代表一个正则表达式对象

  • regex.search(string[,pos[,endpos]])
    在给定的串string里检索,可指定开始和结束位置。默认从头到尾,pos指定开始位置,endpos指定结束位置
  • regex.match(string[,pos[,endpos]])
    检查给定string串是否有与regex匹配的前缀
  • `regex.fullmatch(string[,pos[,endpos]])
    检查string指定范围构成的子串是否与regex匹配,默认范围是整个串
  • 以下两个与re.同名且功能类似,但可指定匹配范围
    regex.findall(string[,pos[,endpos]])
    regex.finditer(string[,pos[,endpos]])
  • 下面两个与re.同名且功能相同
    切分:regex.split(string, maxsplit=0)
    替换:regex.sub(repl, string, count=0)
  • regex.pattern取得生成regex所用的模式字符串
最后由 oucb 编辑于2016年05月22日 11:41