19 Jun 18 复习 正则表达式
https://q1mi.github.io/PythonBlog/post/about_re/
正则表达式的构成
普通字符(字符串和数字,例如:abc123)
元字符(特殊字符,例如:. ^ $ * + ? { } [ ] | ( ) \)
常用元字符表
模式 描述
^ 匹配字符串的开头。
$ 匹配字符串的结尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[…] 用来表示一组字符,单独列出:[amg] 匹配‘a’,’m’或’g’。
[^…]不在[]中的字符:[^abc]匹配除了a,b,c之外的字符。
\w 匹配字母数字及下划线。
\W 匹配非字母数字及下划线。
\s 匹配任意空白字符,等价于[\t\n\r\f]。
\S 匹配任意非空字符。
\d 匹配任意数字,等价于[0-9]。
\D 匹配任意非数字。
\A 匹配字符串开始。
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z 匹配字符串结束。
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,‘er\b’ 可以匹配”never” 中的‘er’,但不能匹配“verb” 中的‘er’。
\B 匹配非单词边界。’er\B’ 能匹配“verb” 中的‘er’,但不能匹配“never” 中的‘er’。
\n,\t\n:匹配一个换行符。\t 匹配一个制表符。
* 匹配0个或多个的表达式。
+ 匹配1个或多个的表达式。
? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式。
{n} 精确匹配n个前面表达式。
{n, m} 匹配n 到m 次由前面的正则表达式定义的片段,贪婪方式。
a|b 匹配a或者b。
(…) 匹配括号内的表达式,也表示一个组。
正则表达式修饰符—可选标志位
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位or(|) 它们来指定。如re.I | re.M 被设置成I 和M 标志:
修饰符 描述信息
re.A使\w,\W,\b,\B,\d,\D,\s和\S执行仅与ASCII匹配而不是完全的Unicode匹配。这只对Unicode模式有意义,对于字节模式将被忽略。
re.DEBUG 显示有关编译表达式的调试信息。
re.I 使匹配对大小写不敏感。
re.L做本地化识别(locale-aware)匹配。
re.M多行匹配,影响^ 和$。
re.S使. 匹配包括换行在内的所有字符。
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
标志位补充解释:
re.I(re.IGNORECASE)
使匹配对大小写不敏感;字符类和字符串匹配字母时忽略大小写。举个例子,指定这个标识位后,[A-Z]也可以匹配小写字母。
re.L(re.LOCALE)
影响“w, “W, “b, 和“B,这取决于当前的本地化设置。
locales 是C 语言库中的一项功能,是用来为需要考虑不同语言的编程提供帮助的。举个例子,如果你正在处理法文文本,你想用“w+ 来匹配文字,但“w 只匹配字符类[A-Za-z];它并不能匹配“é” 或“ç”。如果你的系统配置适当且本地化设置为法语,那么内部的C 函数将告诉程序“é” 也应该被认为是一个字母。当在编译正则表达式时使用LOCALE 标志会得到用这些C 函数来处理“w 後的编译对象;这会更慢,但也会象你希望的那样可以用“w+ 来匹配法文文本。
re.M(re.MULTILINE)
使用“^” 只匹配字符串的开始,而$ 则只匹配字符串的结尾和直接在换行(如果有的话)前的字符串结尾。当指定本标志后,“^” 匹配字符串的开始和字符串中每行的开始。同样的,$ 元字符匹配字符串结尾和字符串中每行的结尾(直接在每个换行之前)。
re.S(re.DOTALL)
使“.” 特殊字符完全匹配任何字符,包括换行;没有这个标志,“.” 匹配除了换行外的任何字符。
re.X(re.VERBOSE)
该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。当该标志被指定时,在RE 字符串中的空白符被忽略,除非该空白符在字符类中或在反斜杠后面;这可以让你更清晰地组织和缩进re表达式。它也可以允许你将注释写入re表达式,这些注释会被引擎忽略;注释用“#“号 来标识,不过该符号不能在字符串或反斜杠后面。
re模块常用方法
re.match() 尝试从字符串的起始位置匹配,如果起始位置不能匹配,re.match()就返回None。
re.match(pattern, string, flags=0)
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等。
re.match方法匹配成功后返回一个匹配对象,否则返回None。
对于匹配对象可以使用group(num)和groups()来获取匹配表达式。
group(num=0):匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups():返回一个包含所有小组字符串的元组,从1 到 所含的小组号。
分组命名匹配:
(?P<分组的名字>正则规则) 注意:是大写的P
re.search 扫描整个字符串并返回第一个成功的匹配。
re.search(pattern, string, flags=0)
pattern:匹配的正则表达式。
string:要匹配的字符串。
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
re.search()方法匹配成功后会返回一个匹配的对象,否则返回None。
re.match和re.search的区别:
re.match只匹配字符串的开始,如果字符串的开始位置不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配,整个字符串都找不到匹配才返回None。
re.split
用匹配到的对象将字符串分割成列表并返回。
re.split(pattern, string, maxsplit=0, flags=0)
pattern:匹配的正则表达式。
string:要匹配的字符串。
maxsplit:模式匹配后分割的最大次数,默认0 表示分割所有的匹配。
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
注意:
当正则匹配项位于字符串的开头或结尾时,re.split()得到列表会有空元素。
re.findall
找到字符串中所有的匹配项,以列表的形式返回。
re.findall(pattern, string, flags=0)
pattern:匹配的正则表达式。
string:要匹配的字符串。
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
re.sub用来替换字符串中的匹配项。
re.sub(pattern, repl, string, count=0, flags=0)
pattern:匹配的正则表达式。
repl:替换的字符串,也可为一个函数。
string:要被查找替换的原始字符串。
count:模式匹配后替换的最大次数,默认0 表示替换所有的匹配。
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
re.compile
将正则表达式模式编译为正则表达式对象,可用于使用其match()和search()方法进行匹配,如下所述。
re_obj = re.compile(pattern)
ret = re_obj.match(string)
等价于:
ret = re.match(pattern, string)