正则表达式是对字符串操作的逻辑公式,方便你对字符串的检索和替换。
python的re模块为我们提供了正则表达式的相关功能,本文章主要介绍
re模块的基本方法和操作。
方法
re.match(pattern,string,flags=0)
尝试从参数string的起始位置匹配一个模式pattren,如果不是起始位置匹配成功的话,则就返回none。
flags是标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
代码
import re
m=re.match("www","www.baidu.com")
m1=re.match("com","www.baidu.com")
print(m)
print(m1)
结果
<_sre.SRE_Match object; span=(0, 3), match='www'>
None
re.search(pattern,strinng,flags=0)
扫描整段字符串string,并返回一个成功的匹配,若没有匹配到则返回None。
代码
import re
m=re.search("www","www.baidu.com")
m1=re.search("com","www.baidu.com")
m2=re.search("34","sdad34ss34")
print(m)
print(m1)
print(m2)
结果
<_sre.SRE_Match object; span=(0, 3), match='www'>
<_sre.SRE_Match object; span=(10, 13), match='com'>
<_sre.SRE_Match object; span=(4, 6), match='34'>
re.sub(pattern, repl, string, count=0, flags=0)
用于替换字符串中的匹配项,string是被替换的字符串,repl是替换的字符串,注意,repl也可以是函数。
count为最大替换次数。
代码
import re
#要替换的字符串
str1="rfg1454-fsd0.r"
#去除所有非数字字符
p=re.sub("\D","",str1)
print(p)
#sub的第二个参数同样可以是函数
#先定义一个函数使所以数字加一
def repl(matched):
values=int(matched.group('values'))
return str(values+1)
p1=re.sub("(?P<values>\d+)",repl,str1)
print(p1)
结果
14540
rfg1455-fsd1.r
re.compile(pattern[, flags])
ompile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
代码
import re
#匹配除a g h以外的字符
pat=re.compile(r"[^agh]+")
s=pat.match("12a4dgh")
s1=pat.search("a4dgh")
print(s)
print(s1)
<_sre.SRE_Match object; span=(0, 2), match='12'>
<_sre.SRE_Match object; span=(1, 3), match='4d'>
re.findall(string[, pos[, endpos]])
在字符串string中找到所以正则表达式匹配到的字符,并返回一个列表。pos是要寻找字符串的起始位置,
endpos是要寻找字符串的结束位置。
代码
import re
#匹配所有数字字符串
pat=re.compile(r"\d+")
s=pat.findall("sf4sa52s4ga")
print(s)
结果
['4', '52', '4']
re.finditer(pattern, string, flags=0)
与findall类似,在字符串string中找到所以正则表达式匹配到的字符,并以迭代器的方式返回。
代码
import re
#匹配所有数字字符串
it=re.finditer("\d+","sad234DdF23S5")
for match in it:
print(match.group())
结果
234
23
5
re.split(pattern,string[, maxsplit=0,flags=0])
通过正则表达式将匹配到的字符分离,未匹配到如何字符,则不进行操作。maxsplit是最大分离次数。
代码
import re
print(re.split('\W+','You Motherfuckers Owe Me'))
print(re.split('(\W+)','You Motherfuckers Owe Me'))
print(re.split('\W+','You Motherfuckers Owe Me',1))
print(re.split('[a-z]+','You Motherfuckers Owe Me'))
结果
['You', 'Motherfuckers', 'Owe', 'Me']
['You', ' ', 'Motherfuckers', ' ', 'Owe', ' ', 'Me']
['You', 'Motherfuckers Owe Me']
['', 'ou ', 'otherfuckers ', 'we ', 'e']
正则表达式修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。
修饰符 | 描述 |
---|---|
re.l | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
正则表达式模式
模式 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[...] | 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k' |
[^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
[0-9] | 匹配任何数字。类似于 [0123456789] |
[a-z] | 匹配任何小写字母 |
[A-Z] | 匹配任何大写字母 |
[a-zA-Z0-9] | 匹配任何字母及数字 |
re* | 匹配0个或多个的表达式。 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
re{ n} | 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。 |
re{ n,} | 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。 |
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 | 匹配字母数字及下划线 |
\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个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |