正则表达式,以python语言为例
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个”规则字符串“,这个”规则字符串“用来表达对字符串的一种过滤逻辑。正则表达式每个语言都有,以python为例,相关函数在re包中。
对于一些常用匹配功能,可以参考 https://tool.oschina.net/regex 的表达式模板。
常见匹配模式:
模式 | 描述 |
---|---|
\w | 匹配字母数字及下划线 |
\W | 匹配非字母数字下划线 |
\s | 匹配任意空白字符 |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于[0-9] |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符 |
[…] | 用来表示一组字符,单独列出:[amk] 匹配‘a’, ‘m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符 |
* | 匹配0个或多个的表达式,如 .* 匹配任意个任意字符, \s*匹配任意个空白字符;.*?与\s*?是非贪婪模式 |
+ | 匹配一个或多个的表达式 |
? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
{n} | 精确匹配n个前面表达式 |
{n,m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a|b | 匹配a或b |
{} | 匹配括号内的表达式,也表示一个组 |
最常规的匹配 re.match
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.match(pattern, string, flags=0): 三个参数分别代表正则表达式,要匹配的字符串,匹配模式。
最大缺点是必须从字符串的第一个字符开始匹配,所以并不常用。
import re
content = "Hello 123 4567 World_This is a Regex Demo"
print(len(content))
result = re.match("Hello\s\d{3}\s\d{4}\s\w{10}.*Demo$", content)
# 作用和上面是一样的(.* 用的好,方便少不了,.* 表示匹配任意多个任意字符)
# result = re.match("Hello.*Demo$", content)
print(result)
print(result.group())
print(result.span())
41
<re.Match object; span=(0, 41), match='Hello 123 4567 World_This is a Regex Demo'>
Hello 123 4567 World_This is a Regex Demo
(0, 41)
匹配目标
import re
content = "Hello 1234567 World_This is a Regex Demo"
# 把要匹配的目标用()括起来,然后指定它的左右端点;group(1)表示第一个小括号,group(n)表示第n个小括号
result = re.match("Hello\s(\d+)\sWorld.*Demo$", content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())
<re.Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
Hello 1234567 World_This is a Regex Demo
1234567
(0, 40)
贪婪匹配
import re
# .* 贪婪模式,会匹配尽可能多的字符。由于(\d+)至少要有一个字符,所以.*给(\d+)留了一个7,123456全匹配啦
content = "Hello 1234567 World_This is a Regex Demo"
result = re.match("He.*(\d+).*Demo$", content)
print(result)
print(result.group())
print(result.g