RE基本语法
. 表示任何一个字符
[a-z]表示任何一个小写字母 [A-Z] 表示任何一个大写字母
[^0-9] 表示除数字的字符 ^ 表示排除种类
* 前一个字符 0 至无数次拓展
+ 表示前一个字符1至无数次拓展
? 前一个字符0至1次拓展
abc|def 表示二者之间任意一个
{x}拓展前一个字符x次
{m,n}拓展前一个字符 m到n次
^ab 表示字符串开头为ab
$cd 表示以 cd 结尾
\w 表示所有单词 等价于 [A-Za-z0-9_]
\d表示所有数字[0-9]
PY{:3}ON 表示前一个自符拓展一次到三次即 PYON、PYYON、PYYYON
示例
^[A-Za-z0-9]+$ 表示由26字母和数字组成的字符串
^-?[0-9]+$ 或 ^-?\d+$ 表示整数
^[0-9]* [1-9] *[0-9]$ 表示正整数
[\u4e00- \u9fa5] 匹配中文字符
0-99 :[1-9]?\d 100-199:1[0-9]{2}
200-249: 2[0-4]\d 250-255: 25[0-5]
匹配IPV4地址:
^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$
匹配IPV4地址(CIDR):
^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}/(([1-2]\d)|(3[0-2])|(\d))$
匹配空行:
/^$/gm
使用re库
re.search(表达式 , 待匹配字符串, 控制标记)
它会返回第一个满足表达式的字符,并且会返回 match对象,意味着需要赋值给一个变量进行操作,若字符串没有对应内容,则会返回 None ,所以需要用 if 来判断是否有匹配值
如
m = re.search(r'[1-9]\d{5}', 'BIT 100081')
if m:
print(m.group(0))
即可打印出匹配字符
re.match(表达式 , 待匹配字符串, 控制标记)
它会返回字符开头的匹配且只匹配字符开头,其余和 re.search 一样,返回match对象
re.findall(表达式 , 待匹配字符串, 控制标记)
它会匹配字符串中所有的内容,返回符合表达式的匹配结果
re.split(表达式 , 待匹配字符串, maxsplit=最大分割数,控制标记(flag))
它会将字符串中所有匹配的内容去掉,然后将分割结果分别加入一个列表中,它的第二个参数为最大分割数
re.finditer(表达式 , 待匹配字符串, 控制标记)
它的返回内容是一个列表,因此可以用for 循环来迭代单独输出字符串中匹配的内容,每个迭代的元素是match对象
re.sub(表达式 , 替换匹配字符串的字符,待匹配字符串,count=最大替换数, 控制标记)
它可以将字符串匹配的内容替换成给定内容
re的 OOP用法
a = re.compile(r'[1-9]\d{5}')
b = a.search('BIT 100081')
可多次使用 a 对象,来加速运行速度
贪婪匹配和最小匹配
若待匹配的字符串中(同一个单词)有多个匹配项,re库默认返回最长的那一个,若需要最小匹配,则需要在匹配规则中加一个 ?