常见正则表达式的规则及使用
regex101
一个可以测试、解释以及参考正则表达式的网站。
正则表达式规则
| 元字符 | 说明 | 示例 |
|---|---|---|
\d | 匹配数字 (0-9) | \d → “5” |
\w | 字母/数字/下划线 (a-z,0-9,_) | \w+ → “Hello” |
\b | 单词的开始或结束 | \bHello\b → " Hello " |
. | 任意单个字符(换行除外) | h. → “ha” |
* | 0次或多次重复 | a* → “aa” |
+ | 1次或多次重复 | \d+ → “123” |
? | 0次或1次重复 | a? → “a” |
{n} | 精确匹配n次 | \d{3} → “123” |
{n,} | 匹配n次或更多次 | \d{3,} → “123” |
{n,m} | 匹配n到m次 | \d{3,4} → “123” |
[ ] | 字符集合 | [a-c] → a/b/c |
^ | 开头匹配 / 取反 | ^\d 开头为数字 |
$ | 结尾匹配 | \d$ 结尾为数字 |
| | 或 | a|b → a 或 b |
[^x] | 除了x以外的字符 | [^a] 除了a的字符 |
捕获组
用圆括号括起来的部分就是捕获组,方便进一步获取内容。
在正则表达式内部或者正则替换时,可以用\k的方式来引用第k个捕获组。
不论捕获组是否嵌套,左括号更前,编号就更前。
捕获组索引从 1 开始,可以用(?P<name>...)的方式给捕获组命名。在正则表达式内部通过(?P=name)来引用命名捕获组;正则替换时用\g<name来引用对应的捕获组。
阻止贪心
正则表达式默认贪心匹配,即匹配最多的字符。比如.*会匹配尽量多的字符直到换行。
对此,加上一个?即可阻止贪心。例如对abc 123来说:
| 正则表达式 | 捕获组内容 |
|---|---|
(.*)\s*[0-9]* | abc 123 |
(.*?)\s*[0-9]* | abc |
Python re 使用
compile
编译正则表达式,加速后续运算:
pattern = re.compile(regex)
match
字符串是否匹配某一模式。
| 表达式 | 作用 |
|---|---|
pattern.match(string) | 字符串开头是否匹配模式 |
pattern.fullmatch(string) | 字符串全部是否匹配模式 |
search
在字符串中找到匹配模式的子串。
| 表达式 | 作用 |
|---|---|
result = pattern.search(string) | 查找匹配模式的第一个子串(找不到则为None) |
result.group() result.group(0) | 匹配到的子串 |
result.group(k) | 返回第k个捕获组或者命名捕获组 |
result.groups() | 所有捕获组的元组 |
result.start() result.end() result.span() | 匹配的起止位置 |
其他
| 表达式 | 作用 |
|---|---|
pattern.findall(string) | 返回所有匹配结果 |
pattern.split(string) | 按模式分割字符串 |
pattern.sub(sub, string) | 正则替换 |
re.DOTALL | 点号匹配换行符 |