re 正则表达式操作
本模块提供了类似于Perl的正则表达式匹配操作。要匹配的模式和字符串可以是Unicode字符串以及8位字符串。
正则表达式使用反斜杠字符(\'\\\')来表示特殊的形式或者来允许使用特殊的字符而不要启用它们特殊的含义。这与字符串字面值中相同目的的相同字符的用法冲突;例如,要匹配一个反斜线字面值,你必须写成\'\\\\\\\\\'作为模式字符串,因为正则表达式必须是\\\\,每个反斜线在Python字符串字面值内部必须表达成\\\\。
解决的办法是使用Python的原始字符串符号表示正则表达式的模式;在以\'r\'为前缀的字符串字面值中,反斜杠不会以任何特殊的方式处理。所以r"\\n"是一个包含\'\\\'和\'n\'两个字符的字符串,而"\\n"是包含一个换行符的单字符字符串。通常在Python代码中,模式的表示使用这种原始字符串符号。
重要的注意事项是大部分正则表达式操作可以利用模块级别的函数和RegexObject的方法。这些函数是快捷的方式,它们不要求你首先编译一个正则表达式对象,但会遗漏一些调优的参数。
请参见
- Mastering Regular Expressions 《精通正则表达式》
- O’Reilly 该书第 2 版不再涵盖Python内容,但其第 1 版中涵盖了很多写得不错、非常详细的正则表达式模式。
7.2.1. 正则表达式语法
正则表达式(或RE)指定一组匹配它字符串;此模块中的函数让你检查一个特定的字符串是否匹配给定的正则表达式(或给定的正则表达式是否匹配特定的字符串,这可归结为同一件事)。
正则表达式可以连接以形成新的正则表达式;如果A和B两个都是正则表达式,那么AB也是正则表达式。一般来说,如果字符串p匹配A且另一个字符串q匹配B,那么字符串pq将匹配AB。除非A或B包含低优先级的操作;A和B之间存在边界条件;或有编号的组的引用。因此,复杂的表达式可以轻松地从这里所描述的更简单的原始表达式构建。关于理论的细节及正则表达式的实现,请参阅上文引用的Friedl的书或任何一本有关编译器构造的教科书。
下面简要说明了正则表达式的格式。进一步的信息和更友好的演示,请参阅正则表达式HOWTO。
正则表达式可以包含特殊和普通字符。最普通的字符,如\'A\'、\'a\'、或\'0\'是最简单的正则表达式;它们简单地匹配它们自己。你可以连接普通字符,所以last匹配字符串\'last\'。(在本节剩下的部分,我们将把正则表达式写成不带引号的形式这种独特风格,要匹配的字符串写成带引号的形式\'用单引号\'。)
某些字符,比如\'|\'或\'(\',比较特殊。特殊字符要么表示某个类别的普通字符,要么影响它们周围的正则表达式如何解释。正则表达式的模式字符串不可以包含空字节,但可以使用\\number符号指定空字节,例如\'\\x00\'。
特殊字符有:
- \'.\'
- (点号。)在默认模式下,匹配除换行以外的任意字符.如果 DOTALL 标志被指定, 则匹配包括换行符在内的所有字符.
- \'^\'
- (脱字符号。)在默认模式下匹配字符串的起始位置, 在MULTILINE模式下也匹配换行符之后的位置.
- \'$\'
- 匹配字符串的末尾或者字符串末尾换行符之前的位置,在MULTILINE模式下还匹配换行符之前的位置。foo既匹配‘foo’也匹配‘foobar’,但是foo$只匹配‘foo’。更有趣的是,正常情况下foo.$只匹配\'foo1\\nfoo2\\n\' ‘foo2’,但是在MULTILINE模式下还能匹配‘foo1’;在\'foo\\n\'中搜索单个$将找到两个(空的)匹配:一个是换行符之前,一个是字符串的末尾。
- \'*\'
- 匹配前面重复出现的正则表达式零次或多次,尽可能多的匹配。ab*将匹配‘a’、‘ab’或‘a’ 后面跟随任意数目的‘b’。
- \'+\'
- 引起生成的RE匹配1个或多个前导的RE,尽可能多的匹配。ab+将匹配‘a’之后跟随任意多个数目不为零的‘b’,它将不能匹配单纯的一个‘a’。
- \'?\'
- 引起生成的RE匹配0个或1个前导的RE。ab?将匹配‘a’或者‘ab’。
- *?, +?, ??
- \'*\'、\'+\'和\'?\'限定符是贪婪的; 它们匹配尽可能多的文本。有时这个行为不是想要的;如果用正则表达式<.*>来匹配\'<H1>title</H1>\',它将匹配完整的字符串,而不会只是\'<H1>\'。在限定符之后加上\'?\'将使得匹配以非贪婪的或最小的方式进行;因为它将匹配尽可能少的字符。在刚才的表达式中使用.*?将只匹配\'<H1>\'。
- {m}
- 表示精确匹配前面的正则表达式的m个拷贝;较少的匹配将导致整个表达式不能匹配。例如,a{6}将精确匹配6个\'a\'字符,5个将不能匹配。
- {m,n}
- 引起生成的正则表达式匹配前导正则表达式的m到n个重复,尝试匹配尽可能多的重复。例如,a{3,5}将匹配3到5个\'a\'字符。省略m表示下界为0,省略n表示上界无限大。举个例子,a{4,}b将匹配aaaab或一千个\'a\'字符后跟随一个b,但不能匹配aaab。逗号不可以省略,否则该修改符将与前面的形式混淆。
- {m,n}?
- 例如,对于6个字符的字符串\'aaaaaa\',a{3,5}将匹配5个\'a\'字符,而a{3,5}?将只匹配3个字符。
- \'\\\'
-
对任一特殊字符进行转义(允许您匹配字符(如\'*\',\' ? \',等等),或只是一个特殊的序列;特殊序列在下面讨论。
如果你不使用原始字符串来表达模式,记住在字符串字面值中Python也使用反斜杠作为转义序列;如果转义序列不能被Python解析器识别,那么结果字符串中包含反斜杠和后面的字符。但是,如果Python会识别所产生的序列,反斜杠应该重复两次。这比较复杂和难以理解,因此强烈建议你为所有即使是最简单的表达式使用原始字符串。
- []
-
用来表示一个字符集合。在一个集合中:
- 字符可以一个一个列出来,例如[amk]将匹配\'a\'、\'m\'或\'k\'。
- 通过给出两个字符并用\'-\'分隔,可以给出一段范围的字符,例如[a-z]将匹配任意一个小写的ASCII字符,[0-5][0-9]将匹配00到59之间所有的两位数字,[0-9A-Fa-f]将匹配任意一个十六进制数字。如果-被转义(例如[a\\-z])或者如果它位于第一个或最后一个字符(例如[a-]),它将只匹配一个字面值\'-\'。
- 在集合内部,特殊字数将失去它们特殊的含义。例如,[(+*)]将匹配字符字面值\'(\'、\'+\'、\'*\'或\')\'。
- 在集合中还接受字符类别,例如\\w或\\S(在下文定义),尽管它们匹配的字符取决于LOCALE或UNICODE模式是否是强制的。
- 不在一段范围之内的字符可以通过补集匹配。如果集合的第一个字符是\'^\',那么所有不在集合中的字符都将被匹配。例如,[^5]将匹配除\'5\'之外的所有字符,[^^]将匹配除\'^\'之外的所有字符。^如果不是集合中的第一个字符则没有特殊的含义。
- 若要匹配集合中的一个字符字面值\']\',可以在它前面放一个反斜线或者将它放在集合的开始。例如,[()[\\]{}]和[]()[{}]都将匹配一个圆括号。
- \'|\'
- A|B, 此处的 A 和 B 可以是任意的正则表达式, 创建的这个正则表达式要么匹配 A 要么匹配 B. \'|\'可以用来隔开任意个数的正则表达式,着同样可以用在组里面。 当扫描字符串时,REs 被用\'|\'从左到右分隔。当一个模式被完全匹配时,这个被匹配的模式就被接受。这意味着一旦 匹配A , B 就不在被尝试, 即使他会产生更长的整体匹配. 换句话说, \'|\' 不是贪婪操作符. 匹配符号 \'|\',用 |, 或者把它包含在组内, 就像是 [|].
- (...)
- 匹配任何在圆括号内的正则表达式, 并表明分组的开始和结束; 分组的内容在完成匹配后可以提取出来,而且可以在后面的字符串中用特殊的number序列匹配,下面有描述。若要匹配字面值\'(\'或\')\',请使用( or ),或它们放入字符类的括号中:[(] [)]。
- (?...)
- This is an extension notation (a \'?\' following a \'(\' is not meaningful otherwise). The first character after the \'?\' determines what the meaning and further syntax of the construct is. Extensions usually do not create a new group; (?P<name>...) is the only exception to this rule.Following are the currently supported extensions.
- (?iLmsux)
-
(集合\'i\', \'L\', \'m\', \'s\', \'u\', \'x\'中的一个或多个字母。)这个分组空字符串;这些字母给真个正则表达式设置相应的标记:
re.I
(忽略大小写),re.L
(依赖区域设置),re.M
(多行),re.S
(点号匹配所有字符),re.U
(依赖Unicode),re.X
(详细模式)。(这些标志在模块的内容中讲述)。它用于如果你想要包含这些标志作为正则表达式的一部分,而不是将flag参数传递给re.compile()函数。请注意,(?x)标志更改解析表达的方式。它应使用在表达式字符串的开始,或一个或多个空白字符之后。如果在这个标志之前有非空白字符,结果是未定义的。
- (?:...)
- 括号形式的正则表达式的非匹配版本。匹配括号中的任何正则表达式,但是匹配的子字符串不能在匹配后提取或在模式中引用。
- (?P<name>...)
-
通过符号组名称name可以访问类似于常规的括号,但由组匹配的子字符串。组名必须是有效的 Python 标识符,并且每个组名必须在正则表达式内只有一次定义。海员象征性的组织也是带编号的组,就好像组未被命名。
Named groups can be referenced in three contexts. If the pattern is (?P<quote>[\'"]).*?(?P=quote) (i.e. matching a string quoted with either single or double quotes):
Context of reference to group “quote” Ways to reference it in the same pattern itself - (?P=quote) (as shown)
- \\1
when processing match object m - m.group(\'quote\')
- m.end(\'quote\') (etc.)
in a string passed to the repl argument of re.sub() - \\g<quote>
- \\g<1>
- \\1
- (?P=name)
- A backreference to a named group; 反向关联一个已被命名的字符串组。 它将匹配之前被关联到name中的所有内容。
- (?#...)
- 一条注释;圆括号内容可简单忽略。
- (?=...)
- Matches if ... matches next, but doesn’t consume any of the string. This is called a lookahead assertion. For example, Isaac (?=Asimov) will match \'Isaac \' only if it’s followed by \'Asimov\'.
- (?!...)
- Matches if ... doesn’t match next. This is a negative lookahead assertion. For example, Isaac (?!Asimov) will match \'Isaac \' only if it’s notfollowed by \'Asimov\'.
- (?<=...)
-
如果在字符串中的当前位置之前由...匹配项的比赛,在当前的位置结束。这就被所谓的积极回顾后发断言。 (? < = abc) def将发现一个匹配abcdef,因为预测先行将备份 3 个字符,并检查是否包含的模式匹配。包含的模式必须只匹配固定长度的字符串,这意味着允许abc 或a|b 的,但a* 和a{3,4} 不允许。请注意,开始与正预测先行断言的模式将不匹配开头的字符串被搜查 ;您将最有可能想要使用search ()函数,而不是match ()函数:
>>> import re >>> m = re.search(\'(?<=abc)def\', \'abcdef\') >>> m.group(0) \'def\'
本示例查看后面一个连字符的词:
>>> m = re.search(\'(?<=-)\\w+\', \'spam-egg\') >>> m.group(0) \'egg\'
- (?<!...)
- 如果字符串的当前位置不匹配之前的 .... 这叫做 否定性回顾断言. Similar to positive lookbehind assertions, the contained pattern must only match strings of some fixed length. Patterns which start with negative lookbehind assertions may match at the beginning of the string being searched.
- (?(id/name)yes-pattern|no-pattern)
-
Will try to match with yes-pattern if the group with given id or name exists, and with no-pattern if it doesn’t. no-pattern is optional and can be omitted. For example, (<)?(w+@w+(?:.w+)+)(?(1)>) is a poor email matching pattern, which will match with \'<user@host.com>\' as well as \'user@host.com\', but not with \'<user@host.com\'.
在 2.4 版本新。
- \\number
- Matches the contents of the group of the same number. Groups are numbered starting from 1. For example, (.+) 1 matches \'the the\' or \'55 55\', but not \'thethe\' (note the space after the group). This special sequence can only be used to match one of the first 99 groups. If the first digit of number is 0, or number is 3 octal digits long, it will not be interpreted as a group match, but as the character with octal value number.Inside the \'[\' and \']\' of a character class, all numeric escapes are treated as characters.
- \\A
- Matches only at the start of the string.
- \\b
- Matches the empty string, but only at the beginning or end of a word. A word is defined as a sequence of alphanumeric or underscore characters, so the end of a word is indicated by whitespace or a non-alphanumeric, non-underscore character.Note that formally, is defined as the boundary between a w and a W character (or vice versa), or between w and the beginning/end of the string, so the precise set of characters deemed to be alphanumeric depends on the values of the UNICODE and LOCALE flags. For example, r\'\\bfoo\\b\' matches \'foo\', \'foo.\', \'(foo)\',\'bar foo baz\' but not \'foobar\' or \'foo3\'. Inside a character range, represents the backspace character, for compatibility with Python’s string literals.
- \\B
- Matches the empty string, but only when it is not at the beginning or end of a word. This means that r\'py\\B\' matches \'python\', \'py3\', \'py2\', but not \'py\', \'py.\', or \'py!\'.\\B is just the opposite of \\b, so is also subject to the settings of LOCALE and UNICODE.
- \\d
- When the UNICODE flag is not specified, matches any decimal digit; this is equivalent to the set [0-9].With UNICODE, it will match whatever is classified as a decimal digit in the Unicode character properties database.
- \\D
- When the UNICODE flag is not specified, matches any non-digit character; this is equivalent to the set [^0-9]. With UNICODE, it will match anything other than character marked as digits in the Unicode character properties database.
- \\s
- When the UNICODE flag is not specified, it matches any whitespace character, this is equivalent to the set [ \\t\\n\\r\\f\\v]. The LOCALE flag has no extra effect on matching of the space. If UNICODE is set, this will match the characters [ \\t\\n\\r\\f\\v] plus whatever is classified as space in the Unicode character properties database.
- \\S
- When the UNICODE flags is not specified, matches any non-whitespace character; this is equivalent to the set [^ \\t\\n\\r\\f\\v]. The LOCALE flag has no extra effect on non-whitespace match. If UNICODE is set, then any character not marked as space in the Unicode character properties database is matched.
- \\w
- When the LOCALE and UNICODE flags are not specified, matches any alphanumeric character and the underscore; this is equivalent to the set [a-zA-Z0-9_]. With LOCALE, it will match the set [0-9_] plus whatever characters are defined as alphanumeric for the current locale. If UNICODE is set, this will match the characters [0-9_] plus whatever is classified as alphanumeric in the Unicode character properties database.
- \\W
- When the LOCALE and UNICODE flags are not specified, matches any non-alphanumeric character; this is equivalent to the set [^a-zA-Z0-9_]. WithLOCALE, it will match any character not in the set [0-9_], and not defined as alphanumeric for the current locale. If UNICODE is set, this will match anything other than [0-9_] plus characters classied as not alphanumeric in the Unicode character properties database.
- \\Z
- 只在字符串的结尾处进行匹配
如果区域设置和UNICODE标志包括为一个特定的序列,区域设置标志可将第一次跟着UNICODE的生效。
由正则表达式分析器也接受大多数支持通过 Python 字符串的标准转义:
\\a \\b \\f \\n
\\r \\t \\v \\x
\\\\
(请注意,用来表示单词边界,并意味着"退格键"只能在字符类的内部。)
八进制转义中有限的形式包括: 如果第一个数字为 0,或者如果有三个八进制数字,它被认为是八进制转义符。否则,它是组引用。字符串文本总是八进制转义顶多是三个数字的长度。
1.2. Module Contents
模块定义了几个函数、 常量和异常。某些功能是充分的特色方法的已编译的正则表达式的简化的版本。大多数非平凡应用程序总是使用的已编译的形式。
- re.compile(pattern, flags=0)
-
将正则表达式模式编译成一个正则表达式对象,它可以用于匹配使用它的match ()和search ()方法,如下所述。
可以通过指定flags值修改表达式的行为。值可以是任何以下变量,使用组合 OR ( |运算符)。
序列
prog = re.compile(pattern) result = prog.match(string)
等效于
result = re.match(pattern, string)
但使用re.compile()和保存所产生的正则表达式对象重用效率更高时该表达式会在单个程序中多次使用。
注
传递给re.match()、 re.search()或re.compile()的最新模式的已编译的版本进行缓存,所以只有几个正则表达式的程序使用一次不必担心编译正则表达式。
- re.DEBUG
-
显示调试信息编译的表达式。
- re.I
- re.IGNORECASE
-
执行不区分大小写的匹配 ;如[A-Z]表达式将太匹配小写字母。这不被受当前的区域设置。
- re.L
- re.LOCALE
-
Make \\w, \\W, \\b, \\B, \\s and \\S dependent on the current locale.
- re.M
- re.MULTILINE
-
当指定时,模式字符\' ^\'匹配字符串的开头以及每个行的开头(紧接每个换行符); 模式字符\'$\'匹配字符串的末尾以及每一行的结尾(紧靠每个换行符之前)。默认情况下, \'^\'只匹配字符串的开始,\'$\'只匹配字符串的末尾和字符串末尾换行符(如果有的话)之前的位置。
- re.S
- re.DOTALL
-
使\'.\'特殊字符匹配任何字符,包括换行 ;如果没有此标志, \'.\'将匹配任何内容除换行符。
- re.U
- re.UNICODE
-
使得\\w, \\W, \\b, \\B, \\d, \\D, \\s和 \\S 取决于UNICODE定义的字符属性.
在 2.0 版中的新。
- re.X
- re.VERBOSE
-
此标志允许您编写正则表达式,看起来更好。在模式中的空白将被忽略,除非当在字符类或者前面非转义反斜杠,和,当一条线包含一个\'#\'既不在字符类中或由非转义反斜杠,从最左侧的所有字符之前,这种\'#\'通过行末尾将被忽略。
这意味着两个以下正则表达式匹配的对象,一个十进制数是相同的功能:
a = re.compile(r"""\\d + # the integral part \\. # the decimal point \\d * # some fractional digits""", re.X) b = re.compile(r"\\d+\\.\\d*")
- re.search(pattern, string, flags=0)
-
扫描字符串,寻找的第一个由该正则表达式模式产生匹配的位置,并返回相应的MatchObject实例。返回None如果没有字符串中的位置匹配模式 ;请注意这不同于在字符串的某个位置中找到一个长度为零的匹配。
- re.match(pattern, string, flags=0)
如果在字符串的开头的零个或更多字符匹配正则表达式模式,将返回相应的MatchObject实例。返回None则该字符串中与模式不匹配;请注意这是不同于零长度匹配。
请注意,即使在多行模式下, re.match()将只匹配字符串的开头,而不是在每个行的开头。
如果你想要在字符串中的任意位置定位一个匹配,改用search () (请参见search () 与 match ())。
re.fullmatch(pattern, string, flags=0)
-
如果整个字符串匹配正则表达式模式,则返回一个match对象。如果字符串与模式不匹配,则返回None;请注意:这与长度为0的match是有区别的。
新版本3.4
- re.split(pattern, string, maxsplit=0, flags=0)
-
将字符串拆分的模式的匹配项。如果在模式中使用捕获括号,则然后也作为结果列表的一部分返回的文本模式中的所有组。如果maxsplit不为零,顶多maxsplit分裂发生,并且该字符串的其余部分将作为列表的最后一个元素返回。(不兼容性说明: 在原始的 Python 1.5 版本中, maxsplit被忽略。这已被固定在以后的版本。)
>>> re.split(\'\\W+\', \'Words, words, words.\') [\'Words\', \'words\', \'words\', \'\'] >>> re.split(\'(\\W+)\', \'Words, words, words.\') [\'Words\', \', \', \'words\', \', \', \'words\', \'.\', \'\'] >>> re.split(\'\\W+\', \'Words, words, words.\', 1) [\'Words\', \'words, words.\'] >>> re.split(\'[a-f]+\', \'0a3B9\', flags=re.IGNORECASE) [\'0\', \'3\', \'9\']
如果在分离器有捕获组,它匹配字符串的开头,结果将启动与空字符串。同样对于字符串的末尾:
>>> re.split(\'(\\W+)\', \'...words, words...\') [\'\', \'...\', \'words\', \', \', \'words\', \'...\', \'\']
这样一来,分离器组件始终都位于相同的相对索引在结果列表中 (例如,如果有是在分离器,在 0,第二个捕获组等等)。
请注意,拆分将永远不会拆分对空模式匹配的字符串。举个例子:
>>> re.split(\'x*\', \'foo\') [\'foo\'] >>> re.split("(?m)^$", "foo\\n\\nbar\\n") [\'foo\\n\\nbar\\n\']
2.7 版本中的更改:添加可选的标志参数。
- re.findall(pattern, string, flags=0)
-
作为一个字符串列表,在字符串中,返回所有非重叠匹配的模式。该字符串是从左到右扫描的,匹配按照发现的顺序返回。如果一个或多个组是本模式中,返回一个列表的群体 ;如果该模式具有多个组,这将是元组
以上是关于python re的主要内容,如果未能解决你的问题,请参考以下文章