正则表达式
通配符:.
- 句点与除换行符外所有字符都匹配,如 '.ython' 与 '+ython'、'jython' 都匹配。
转义符
- \\ 表示转义符,因为 . 表示通配符,那么 \\. 表示真正的句点。
- 在字符串前面加一个 r 就可以用一个 \ 表示转义,如 r'hhh\.'
字符集
- [] 中的字符表示一个字符集,即其中的任意一个字符都匹配,如 '[pj]ython' 与 'python' 和 'jython' 匹配。
- 字符集中还可以使用 - 表示范围。比如 '[a-zA-Z0-9]' 表示所有字母和数字。
- 在开头加一个 ^ 表示除此之外的字符,比如 '[^ab]' 表示除了 ab 以外的字符。
预定义字符集
| 字符 |
说明 |
| \d |
数字 |
| \D |
非数字 |
| \s |
空白字符 |
| \S |
非空白字符 |
| \w |
单词字符 |
| \W |
非单词字符 |
数量词
| 字符 |
说明 |
| * |
0到无限次 |
| + |
1到无限次 |
| ? |
0或1次 |
| m |
m次 |
| {m,n} |
m到n次 |
- 如果想要指定多个字符出现次数,加上圆括号,比如 'TT(python)+JQ' 指定 python 可以出现多次。
- 中括号里面的字符集可以任意出现,比如 '[pj]+ython' 可以匹配 'pjpython'。
数量词的贪婪与非贪婪
- 数量词是默认贪婪的,也就是能尽可能多地匹配
- 如果要设定为非贪婪的,可以在数量词后面加一个 ? 表示非贪婪。
匹配开头和结尾
- 在字符串最前面加 ^ 表示只匹配字符串的开头,在字符串最后加 $ 表示只匹配字符串的结尾。
多选一模式
- 用 (|)表示可以选择其中的任意一个,比如 '(apple|lemon|orange)juice' 可以匹配三种口味的果汁。与上述中括号区别是,中括号里面的可选字符都是单字符。
主要函数
- 上面只介绍了如何用正则表达式表示想要处理的字符串,至于怎么去处理,就需要用到 re 模块的函数了。
- 以下具有查询功能的函数,查询结果返回一个对象(逻辑真),如果没有匹配则返回 none(逻辑假)
compile(pattern)
- 上述正则表达式是字符串形式,通过 compile 以后就可以转换成正则表达式的一个模式对象。
- 是否转换为模式对象,都可以调用正则的函数,如下:
result = re.search(pattern, string) #直接得到结果
obj = re.compile(pattern)
result = obj.search(string) #先通过 compile 转换
search(string)
match(string)
- 在字符串开头匹配正则表达式
- 如果在正则表达式后面加 $ 说明必须要开头符合并且结尾也符合,也就是完全相同。
split(string, maxSplit)
- 这个函数是提取数据的神器,可以根据正则表达式分割字符串,返回一个列表。
string = "alpha , , beta,,, ,gamma"
result = re.split('[, ]+', string)
print(result)
# ['alpha', 'beta', 'gamma']
string = "alpha , , beta,,, ,gamma"
result = re.split('[, ]+', string, 1)
print(result)
# ['alpha', 'beta,,, ,gamma']
findall(string)
- 返回一个列表,其中包含字符串中所有与模式匹配的子串。
- 注意这个函数虽然也是匹配查找,但是并不是返回对象。
- 比如以下程序可以分割一篇文章的文字。
string = "waou, you can really dance !"
words = re.findall(r'\w+',string)
# ['waou', 'you', 'can', 'really', 'dance']
escape(string)
- 将 string 中含有的所有正则表达式特殊字符进行转义。
- 比如 'www.python' 就变成了 'www\.python'
sub(repl, string)
- 将匹配字符全部转换为 repl
- 这个方法基本操作与字符串的方法 replace 功能相同,但是在匹配对象编组后将会更加强大。
匹配对象编组
- 上述函数返回的对象就是匹配对象,匹配对象会进行编组。我们在写正则表达式的时候,可以用 () 括起来一部分,这就是进行编组。
- 比如 'there (was a (wee) (cooper) who (lived in Fyfe))' 就会被编成 0-4 组,根据从左到右第一次出现 ( 确定
- 0 There was a wee cooper who lived in Fyfe
- 1 was a wee cooper
- 2 wee
- 3 cooper
- 4 lived in Fyfe
- 匹配对象可以根据编组,有如下可以调用的方法(group 默认为 0):
| 方法 |
描述 |
| group(group) |
获取匹配子串 |
| start(group) |
获取匹配子串起始位置 |
| end(goup) |
获取匹配子串终止位置(与切片一样,不包括终止位置) |
| span(group) |
获取起始和终止位置 |
替换中的组号
- 最后我们看一下替换中组号的应用。
- 先看一下很绕的定义:在替换字符串中,任何类似于 '\\n' 的转义序列都将被替换为与模式中编组 n 匹配的字符串。
string = '*this* is *it*'
pattern = r'\*(.+?)\*'
result = re.sub(pattern, r'<em>\1</em>', string)
print(result)
# <em>this</em> is <em>it</em>
- 用例子和人话解释一下,pattern 是识别 * * 的,并将 * 中间的字符串编为1组,后面是替换的字符串,将替换匹配的内容,中间 \1 由匹配的编号为1的内容替代。
本文章使用limfx的vsocde插件快速发布