正则表达式语法

2.7k words

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个字符串串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则表达式常用的字符如下:

char 描述
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 . 。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 [。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\‘ 匹配 “",而 ‘(‘ 则匹配 “(“。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 ^。
{ 标记限定符表达式的开始。要匹配 {,请使用 {。
| 指明两项之间的一个选择。要匹配 |,请使用 |。

匹配单个字符

Char Function
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_
\W 匹配非单词字符

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import re
ret = re.match(".","M")
print(ret.group()) #M

ret = re.match("t.o","too")
print(ret.group()) #too

ret = re.match("[hH]ello","hello Python")
print(ret.group()) # hello

ret = re.match("[0-9]Hello Python","7Hello Python”)
print(ret.group()) # 7Hello Python

ret = re.match("[0-3,5-9]Hello Python","7Hello Python")
print(ret.group()) # 7Hello Python

ret = re.match("嫦娥\d号","嫦娥1号发射成功")
print(ret.group()) #嫦娥1号

匹配多个字符

Char Function
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现从m到n次

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import re
ret = re.match("[A-Z][a-z]*","M")
print(ret.group()) #M

ret = re.match("[A-Z][a-z]*","MnnM")
print(ret.group()) #Mnn

ret = re.match("[1-9]?[0-9]","7")
print(ret.group()) #7

ret = re.match("[1-9]?\d","33")
print(ret.group()) #33

ret = re.match("[1-9]?\d","09")
print(ret.group()) #None

ret = re.match("[a-zA-Z0-9_]{6}","12a3g45678")
print(ret.group()) #12a3g4

ret = re.match("[a-zA-Z0-9_]{8,20}","1ad12f23s34455ff66")
print(ret.group()) #1ad12f23s34455ff66

获取子串

String Function
(.+?) 惰性匹配,从左到右匹配,并且至少有一个字符
(.+) 贪婪匹配,整个字符串是否匹配,并且至少有一个字符
(.*?) 惰性匹配,从左到右匹配
(.*) 贪婪匹配,整个字符串是否匹配

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import re
txt = "<111222><3334444>"
ret = re.findall(r"<(.+?)>", txt)
# 返回 111222 和 3334444

txt = "<111222><3334444>"
ret = re.findall(r"<(.+)>", txt)
# 返回 111222><3334444

txt = "<111222><3334444>"
ret = re.findall(r"<.+>", txt)
# 返回 <111222><3334444>

txt = "<><3334444><555666>"
ret = re.findall(r"<(.*?)>", txt)
# 返回 ""和3334444和555666

txt = "<><3334444><555666>"
ret = re.findall(r"<(.+?)>", txt)
# 返回 ><3334444和555666
Comments