python通过re模块实现正则表达式
因此在使用正则表达式前需要引用re模块
首先介绍几个方法:
- search()方法
re.search 扫描整个字符串并返回第一个成功的匹配位置,匹配成功返回一个匹配的对象,否则返回None。
函数语法:
re.search(pattern, string, flags=0)
函数参数说明:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
可选标志–flags
正则表达式可以包含一些可选标志修饰符来控制匹配的模式,多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志。
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
例:
import re
re.search(r'love','wo love ni ',re.I)
[out] <re.Match object; span=(3, 7), match='love'>
- group([num])方法
该方法用于对类似search方法得到的匹配对象输出得到匹配表达式,num表示输出第num个括号的正则表达式匹配的字符串。
例:
In [3]: result = re.search(r'(i)(love)','iloveyou')
In [4]: result.group()
Out[4]: 'ilove'
In [5]: result.group(1)
Out[5]: 'i'
In [6]: result.group(2)
Out[6]: 'love'
- span() 表示匹配模式在查找的字符串中的位置范围。
- start() 表示匹配模式在查找的字符串中的开始位置。
- end() 表示匹配模式在查找的字符串中的结束位置。
例:
In [9]: result = re.search(r'love','iloveyou')
In [10]: result.span()
Out[10]: (1, 5)
In [11]: result.start()
Out[11]: 1
In [12]: result.end()
Out[12]: 5
正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式,由于正则表达式通常都包含反斜杠,所以最好使用原始字符串来表示它们,模式元素(如 r’\t’,等价于 ‘\t’)匹配相应的特殊字符。
下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
模式 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。(note:$放在pattern末尾) |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符,\ .消除 . 的特殊含义。 |
[…] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
* | 匹配0个或多个的表达式。 |
+ | 匹配1个或多个的表达式。 |
? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
{n} | 匹配 n 个前面表达式。例如, o{2} 匹配 两个 “o”,能匹配 “food” 中的两个 o。 |
{n,} | 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。“o{1,}” 等价于 “o+”。“o{0,}” 则等价于 “o*”。 |
{n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a丨b | 匹配a或b |
( ) | 对正则表达式分组并记住匹配的文本 |
(?imx) | 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。 |
(?-imx) | 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。 |
(?: re) | 类似 (…), 但是不表示一个组 |
(?imx: re) | 在括号中使用i, m, 或 x 可选标志 |
(?-imx: re) | 在括号中不使用i, m, 或 x 可选标志 |
(?#…) | 注释. |
(?= re) | 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 |
(?! re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 |
(?> re) | 匹配的独立模式,省去回溯。 |
\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, | 等. 匹配一个换行符。匹配一个制表符。等 |
\1…\9 | 匹配第n个分组的内容。 |
\10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式 |
编译正则表达式
如果我们需要重复的使用某个正则表达式,那么可以先将该正则表达式编译成模式对象,便于重复使用。
语法:
compile(pattern[,flags] )
pattern – 字符串或者AST(Abstract Syntax Trees)对象。
flags – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
编译后的正则表达式使用search方法时会有改变
语法:
regex.search(pattern[,pos[,endpos]])
pos – 开始搜索的位置
endpos – 结束搜索的位置
例:
In [1]: import re
In [2]: p = re.compile(r'love')
In [3]: p.search('wo love ni i love you')
Out[3]: <re.Match object; span=(3, 7), match='love'>
In [4]: type(p)
Out[4]: re.Pattern
In [5]: re.search(p,'i love u')
Out[5]: <re.Match object; span=(2, 6), match='love'>
In [6]: p.search('wo love ni i love you',6)
Out[6]: <re.Match object; span=(13, 17), match='love'>
In [7]: p.search('wo love ni i love you',6,9)
In [8]: p.search('wo love ni i love you',6,20)
Out[8]: <re.Match object; span=(13, 17), match='love'>
贪婪与非贪婪
- 贪婪是指在符合pattern的情况下,会尽力的多匹配字符串。我们可以通过在pattern后加上?还消除贪婪模式。
- 非贪婪是指匹配到第一个符合pattern的字符串就停止。
例:
re.search(r'(ab)*','abababababb')
Out[1]: <re.Match object; span=(0, 10), match='ababababab'>
re.search(r'ab*?','abababababb')
Out[2]: <re.Match object; span=(0, 1), match='a'>