一、简介
1.1、相关链接
官方文档:
Python2:https://docs.python.org/2/library/re.html
Python3:https://docs.python.org/3/library/re.html
HOWTO:
Python2:https://docs.python.org/2/howto/regex.html
Python3:https://docs.python.org/3/howto/regex.html
参考blog:
python正则表达式详解
Python 正则表达式
Python正则表达式详解——re库
二、函数详解
2.1、正则匹配的基本事项
- 函数中使用参数标识:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
- 函数中flags取值:
Flag | Meaning |
---|---|
DOTALL, S | Make . match any character, including newlines 使 . 匹配包括换行在内的所有字符 |
IGNORECASE, I | Do case-insensitive matches 使匹配对大小写不敏感 |
LOCALE, L | Do a locale-aware match 做本地化识别(locale-aware)匹配 |
MULTILINE, M | Multi-line matching, affecting ^ and $ 多行匹配,影响 ^ 和 $ |
VERBOSE, X | Enable verbose REs, which can be organized more cleanly and understandably. 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
UNICODE, U | Makes several escapes like \w, \b, \s and \d dependent on the Unicode character database. 根据Unicode字符集解析字符。这个标志影响 |
- 正则表达式的通配符表示含义:
模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
多数字母和数字前加一个反斜杠时会拥有不同的含义。
标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠转义。
由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r’\t’,等价于 ‘\t’)匹配相应的特殊字符。
下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
模 式 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。 |
. | 匹配除了换行符(\n)的任意字符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[…] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
re* | 匹配0个或多个的表达式。 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
re{ n} | 精确匹配n个前面表达式。 |
re{ n,} | 匹配n个或多个前面表达式。 |
re{ n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a| b | 匹配a或b |
(re) | 匹配括号内的表达式,也表示一个组 |
(?imx) | 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。 |
(?-imx) | 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。 |
(?: re) | 类似 (…), 但是不表示一个组 |
(?imx: re) | 在括号中使用i, m, 或 x 可选标志 |
(?-imx: re) | 在括号中不使用i, m, 或 x 可选标志 |
(?#…) | 注释. |
(?= re) | 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 |
(?! re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 |
(?> re) | 匹配的独立模式,省去回溯。 |
\w | 匹配字母数字及下划线,等价于’[A-Za-z0-9_]’。 |
\W | 匹配非字母数字及下划线,等价于 ‘[^A-Za-z0-9_]’。 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f]. |
\S | 匹配任意非空字符,等价于 [^ \f\n\r\t\v]。 |
\d | 匹配任意数字,等价于 [0-9]. |
\D | 匹配任意非数字,等价于 [^0-9]。 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
\B | 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
\n, \t, 等. | 匹配一个换行符。匹配一个制表符。等 |
\1…\9 | 匹配第n个分组的内容。 |
\10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |
2.2、常用函数
以下是re模块常用的七个函数:
函数名 | 含义 | 实例(3.7.3) |
---|---|---|
re.compile() | 将正则表达式模式编译成一个正则表达式对象,它可以用于匹配使用它的match ()和search ()方法,如下所述。 可以通过指定flags值修改表达式的行为。值可以是任何以下变量,使用组合 OR ( |运算符)。 但使用re.compile()和保存所产生的正则表达式对象重用效率更高时该表达式会在单个程序中多次使用。 | 语法:compile(pattern, flags=0) >>> import re >>> s=’[a-z]+\d*’ >>> a=re.compile(s) >>> a re.compile(’[a-z]+\d*’) >>> type(a) <class ‘re.Pattern’> >>> b=a.match(‘a123’) >>> b.group() ‘a123’ 等价于 >>> b=re.match(’[a-z]+\d*’,‘a123’) >>> b.group() ‘a123’ |
re.escape() | 返回的字符串与所有非字母数字带有反斜杠;这是有用的如果你想匹配一个任意的文本字符串,在它可能包含正则表达式元字符 简单理解:把字符串按照可能会是正则表达式来理解,这样就需要把特殊字符都转义。这样才能方便匹配时精确匹配每个字符。 字符’[a-z]'这个字符串可以看作是正则表达式的模式,这样就不能作为被匹配的字符串。如果想把这个字符串作为被匹配的模式就需要转义这些特殊字符。 | 语法:escape(pattern) >>> print(re.escape(’[a-z]’)) \[a\-z\] >>> s=‘abc.|123’ >>> print(s) abc.|123 >>> print(re.escape(s)) abc\.\|123 |
re.findall() | 作为一个字符串列表,在字符串中,返回所有非重叠匹配的模式。该字符串是从左到右扫描的,匹配按照发现的顺序返回。如果一个或多个组是本模式中,返回一个列表的群体 ;如果该模式具有多个组,这将是元组的列表。空匹配包含在结果中,除非他们接触到另一场匹配的开头。 返回一个匹配的所有内容的列表。如果没有匹配内容则返回空列表。 在 1.5.2 版本新。 2.4 版本中的更改:添加可选的标志参数。 | 语法:findall(pattern, string, flags=0) >>> a = ‘abc,123.abc.123’ >>> s = ‘[a-z]+’ >>> r = re.findall(s,a) >>> r [‘abc’, ‘abc’] |
re.match() re.fullmatch() | 如果在字符串的开头的零个或更多字符匹配这个正则表达式,将返回相应的作法实例。 简单理解:就是从字符串的开始做正则匹配。能匹配到的最大位置返回。返回的对象用group/groups方法读取。可以不匹配到字符串的末尾。但是字符串的开始必须匹配,否则返回空字符串。 re.fullmatch()需要全匹配 | 语法:match(pattern, string, flags=0) >>> s = ‘[a-z]*’ >>> a = ‘test123’ >>> b = re.match(s,a) >>> b.group() ‘test’ >>> a = ‘123abc’ >>> b = re.match(s,a) >>> b.group() ’’ >>> s = ‘[a-z]+\d?’ >>> b = re.fullmatch(s,a);b.group() ‘te2’ |
re.search() | 扫描字符串寻找第一个匹配位置,在此正则表达式产生的匹配,并返回相应的MatchObject实例。如果没有字符串中的位置匹配模式返回空 。 可选的第二个参数pos给索引在字符串中搜索在哪里开始;它将默认为0。这并不完全等于切片的字符串 ; ’ ^'模式字符匹配在真正开始的字符串和位置刚换行,但不是一定是在开始搜索的索引。 可选参数endpos限制了多远的字符串将被搜索 ;它将,如果字符串是endpos个字符长,因此,只有从pos到字符endpos - 1将搜索匹配项。如果endpos小于pos,没有比赛会发现,否则,如果rx是已编译的正则表达式对象, rx.search (字符串, 0, 50)相当于rx.search (字符串 [: 50], 0)。 注意:如果查找字符时用*则会默认匹配0个对应的字符。这样就会返回空字符串。 | 语法:search(pattern, string, flags=0) >>> s = ‘\d*’ >>> a = ‘abc123,31’ >>> s = re.search(s,a) >>> s.group() ’’ >>> s.span() (0, 0) >>> s = ‘\d+’ >>> s = re.search(s,a) >>> s.span() (3, 6) >>> s.group() ‘123’ |
re.split() | 将字符串拆分的模式的匹配项。如果在模式中使用捕获括号,则然后也作为结果列表的一部分返回的文本模式中的所有组。如果maxsplit不为零,顶多maxsplit分裂发生,并且该字符串的其余部分将作为列表的最后一个元素返回。(不兼容性说明: 在原始的 Python 1.5 版本中, maxsplit被忽略。这已被固定在以后的版本。) | 语法:split(pattern, string, maxsplit=0, flags=0) >>> text = “”“Ross McFluff: 834.345.1254 155 Elm Street Ronald Heathmore: 892.345.3428 436 Finley Avenue Frank Burger: 925.541.7625 662 South Dogwood Way Heather Albrecht: 548.326.4584 919 Park Place”"" >>> text ’Ross McFluff: 834.345.1254 155 Elm Street\nRonald Heathmore: 892.345.3428 436 Finley Avenue\nFrank Burger: 925.541.7625 662 South Dogwood Way\nHeather Albrecht: 548.326.4584 919 Park Place’ >>> entries = re.split("\n+", text) >>> entries [‘Ross McFluff: 834.345.1254 155 Elm Street’, ‘Ronald Heathmore: 892.345.3428 436 Finley Avenue’, ‘Frank Burger: 925.541.7625 662 South Dogwood Way’, ‘Heather Albrecht: 548.326.4584 919 Park Place’] >>> re.split("\n+",text)[0] ‘Ross McFluff: 834.345.1254 155 Elm Street’ >>> [re.split(":? “, entry, 3) for entry in entries] [[‘Ross’, ‘McFluff’, ‘834.345.1254’, ‘155 Elm Street’], [‘Ronald’, ‘Heathmore’, ‘892.345.3428’, ‘436 Finley Avenue’], [‘Frank’, ‘Burger’, ‘925.541.7625’, ‘662 South Dogwood Way’], [‘Heather’, ‘Albrecht’, ‘548.326.4584’, ‘919 Park Place’]] >>> [re.split(”:? ", entry, 4) for entry in entries] [[‘Ross’, ‘McFluff’, ‘834.345.1254’, ‘155’, ‘Elm Street’], [‘Ronald’, ‘Heathmore’, ‘892.345.3428’, ‘436’, ‘Finley Avenue’], [‘Frank’, ‘Burger’, ‘925.541.7625’, ‘662’, ‘South Dogwood Way’], [‘Heather’, ‘Albrecht’, ‘548.326.4584’, ‘919’, ‘Park Place’]] |
re.sub() | Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl. 如果pattern没有被找到, string不变。repl 可以是一个字符串或一个函数;如果是一个字符串, 任何反斜杠转义都会实现。那就是,\n会转化成一个换行符,\r 会转化成一个回车,等等。 未知的转义字符例如 \j不做处理。 简单理解:按照规则pattern匹配字符串string,匹配的字符串按照规则repl来替换。替换后和原来字符串组合返回。repl可以使字符串也可以是函数。 | 语法:sub(pattern, repl, string, count=0, flags=0) >>> re.sub(r’def\s+([a-zA-Z_][a-zA-Z_0-9])\s(\s*):’, r’static PyObject*\npy_\1(void)\n{’, ‘def myfunc():’) ‘static PyObject*\npy_myfunc(void)\n{’ >>> def dashrepl(matchobj): if matchobj.group(0) == ‘-’: return ’ ’ else: return ‘-’ >>> re.sub(’-{1,2}’, dashrepl, ‘pro----gram-files’) ‘pro–gram files’ >>> re.sub(r’\sAND\s’, ’ & ', ‘Baked Beans And Spam’, flags=re.IGNORECASE) ‘Baked Beans & Spam’ |
re.sub实例: