python 正则表达式和re模块

正则表达式

. 点号,在默认模式下,匹配除换行以外的任意字符。如果 DOTALL 标志被指定, 则匹配包括换行符在内的所有字符。

^    乘方运算符或脱字节符,在默认模式下匹配字符串的起始位置,在MULTILINE模式下也匹配换行符之后的位置。
$    匹配字符串的末尾或者字符串末尾换行符之前的位置,在MULTILINE模式下还匹配换行符之前的位置。
*    匹配前面重复出现的正则表达式零次或多次,尽可能多的匹配(greedy 贪婪型)。
+    匹配前面RE 1次或多次(贪婪型,尽可能多的匹配)。
?    匹配前面的RE 0次或1次。
*?,+?,??    '*'、'+'和'?'限定符是贪婪的;它们匹配尽可能多的文本。在限定符之后加上'?'将使得匹配以非贪婪的或最小的方式进行。
{m}        表示精确匹配前面的正则表达式的m个拷贝,较少的匹配将导致整个表达式不能匹配。
{m,n}    匹配前导正则表达式的m到n个重复,尝试匹配尽可能多的重复(greedy 贪婪型)。
{m,}    匹配前导正则表达式的至少m次,尝试匹配尽可能多的重复(greedy 贪婪型)。
{,n}    匹配前导正则表达式的至多n次,尝试匹配尽可能多的重复(greedy 贪婪型)。
{m,n}?    匹配前导正则表达式的m到n个重复,尝试匹配尽可能少的重复(Non-greedy 非贪婪型)。
\        对特殊符号进行转义
[]        用来表示一个字符集合。
        字符可以一个一个的列出来,如[abcd],则可以匹配'a','b','c','d'。
        通过给出两个字符并用'-'分隔,可以给出一段范围的字符,如[a-z]匹配小写字母,[A-Z]匹配大写字母,[0-9]匹配0-9的数字。
        在集合内部,特殊字符将失去它们特殊的含义,如[(+*)]将匹配'(','+','*',')'。
        在集合中接受字符类别\s,\S,\w等。
        可以使用[^RE]作为字符集的补集,^必须为集合第一个字符,如[^a-z]可以匹配除小写字母外所有的字符。
|        a|b 匹配a或b,(Non-greedy 非贪婪型),匹配上正则a后,就不会再去尝试匹配正则b。
(...)    被圆括号括起来的表达式将作为分组,分组表达式作为一个整体,后面可以接数量词,表达式中|仅在该组中有效。
        如(a-z|A-Z){2,3}表示匹配字母2至3次。
(?aiLmsux)    给整个正则表达式设置相应的标记:re.A(ASCII码模式),re.I(忽略大小写),re.L(依赖区域设置);
            re.M(多行模式),re.S(点号匹配所有字符),re.U(依赖Unicode),re.X(详细模式)
(?:...)    # 当你要将一部分规则作为一个整体对它进行某些操作,可以使用(?:RE)将正则表达式RE包裹起来。
(?P<name>...)    # 将RE字符串包裹进来作为一个命名组。
(?P=name)        # 使用命名组进行匹配。匹配前面定义的命名组匹配到的字符串。
(?#...)            # 添加备注,忽略指定的字符。
(?='...')        # 如果指定的字符在匹配到的字符后面,才算匹配成功。s='Isaac Asimov'   m=re.findall("Isaac (?=Asimov)",s)
(?!...)            # 如果指定的字符不在匹配到的字符后面,才算匹配成功。s='Isaac Asimov'   m=re.findall("Isaac (?!Asimov)",s)
(?<=...)         # 如果指定的字符在匹配到的字符前面,才算匹配成功。s='Isaac Asimov'   m=re.findall("(?<=Isaac )Asimov",s)
(?<!...)        # 如果指定的字符不在匹配到的字符前面,才算匹配成功。s='Isaac Asimov'   m=re.findall("(?<!Isaac )Asimov",s)
(?(id/name)yes|no)        #选择性匹配 (?(id/name)yes-pattern|no-pattern) 的作用是:
                            对于给出的id或者name,先尝试去匹配 yes-pattern部分的内容;
                            如果id或name条件不满足,则去匹配no-pattern部分的内容;no-pattern部分可以省略;
                            此处的name或id,是针对(当前位置的)条件性匹配之前的,某个已经通过group去分组的内容
                            如果是有命名的分组,即named group,则对应的该分组就有对应的name,即此处所指的就是对应的name;
                            如果是无命名的分组,即unnamed group,则对应的该分组也有对应的分组的编号,称为group的number,
                            也叫做id,对应的就是这里的id。
    *** 预定义字符集
\\        匹配反斜杠
\A        匹配字符串开头,同^
\Z        匹配字符串结尾,同$
\number    匹配相同编号的组的内容
\b        匹配空字符串,仅在词的开头和结尾
\B        匹配空字符串,不在词的开头和结尾,与\b相反
\d        匹配数字,等同于[0-9]
\D        匹配非数字,等同于\d的补集,即[^\d]
\s        匹配whitespace字符串,同等于[ \t\n\r\f\v]
\S        匹配非whitespace字符串,\s的补集,[^\s]
\w        匹配字母,数字,下划线,等同于[a-zA-Z0-9_]
\W        \w的补集

使用re模块的步骤

我们有必要对re模块中所包含的类及其工作流程进行一下简单的、整体性的说明,这讲有利于我们对下面内容的理解。

使用re模块进行正则匹配操作的步骤:

  • 编写表示正则表达式规则的Python字符串str;
  • 通过re.compile()函数编译该Python字符串获得一个正则表达式对象(Pattern Object)p;
  • 通过正则表达式对象的p.match()或p.fullmatch()函数获取匹配结果–匹配对象(Match Object)m;
  • 通过判断匹配对象m是否为空可知是否匹配成功,也可以通过匹配对象m提供的方法获取匹配内容。

使用re模块进行内容查找、替换和字符串分隔操作的步骤:

  • 编写表示正则表达式规则的Python字符串str;
  • 通过re.compile()函数编译该Python字符串获得一个正则表达式对象(Pattern Object)p;
  • 通过正则表达式对象的p.search()或p.findall()或p.finditer()或p.sub()或p.subn()或p.split()函数完内容查找、替换和字符串分隔操作并获取相应的操作结果;

总结:

  • 根据上面的描述可知,将一个表示正则表达式的Python字符串编译成一个正则表达式对象是使用正则表达式完成相应功能的首要步骤.
  • re模块中用于完成正则表达式编译功能的函数为re.compile()。

re.compile(patternflags=0)将正则表达式的样式编译为一个 正则表达式对象 (正则对象),可以用于匹配,通过这个对象的方法 match()search() 以及其他如下描述。

 

prog = re.compile(pattern)
result = prog.match(string)

等价于

result = re.match(pattern, string)
re.search(patternstringflags=0)

扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象。如果没有匹配,就返回一个 None ; 注意这和找到一个零长度匹配是不同的。

re.match(patternstringflags=0)

如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的 匹配对象 。 如果没有匹配,就返回 None ;注意它跟零长度匹配是不同的。

注意即便是 MULTILINE 多行模式, re.match() 也只匹配字符串的开始位置,而不匹配每行开始。

如果你想定位 string 的任何位置,使用 search() 来替代(也可参考 search() vs. match() )

re.fullmatch(patternstringflags=0)

如果整个 string 匹配到正则表达式样式,就返回一个相应的 匹配对象 。 否则就返回一个 None ;注意这跟零长度匹配是不同的。

3.4 新版功能.

re.split(patternstringmaxsplit=0flags=0)

用 pattern 分开 string 。 如果在 pattern 中捕获到括号,那么所有的组里的文字也会包含在列表里。如果 maxsplit 非零, 最多进行 maxsplit 次分隔, 剩下的字符全部返回到列表的最后一个元素。

re.findall(patternstringflags=0)

Return all non-overlapping matches of pattern in string, as a list of strings or tuples. The string is scanned left-to-right, and matches are returned in the order found. Empty matches are included in the result.

The result depends on the number of capturing groups in the pattern. If there are no groups, return a list of strings matching the whole pattern. If there is exactly one group, return a list of strings matching that group. If multiple groups are present, return a list of tuples of strings matching the groups. Non-capturing groups do not affect the form of the result.

 

字符串分割

使用re.split(pattern, string, maxsplit=0, flags=0)进行字符分割:

字符串替换

使用re.sub(pattern, repl, string, count=0, flags=0)对字符串进行替换:

字符转义

使用re.escape将所有字符转义:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注