正则表达式

本文总阅读量

Python 使用正则表达式的一些知识。

Python 调用正则表达式

Python 中使用正则表达式需要先导入 re 模块并且定义正则表达式然后再进行通过 re 模块的函数调用

>>> import re
>>> p = r'\w+@gmail\.com'
>>> email = 'hieroglyphs@gmail.com'
>>> m = re.match(p, email)
>>> print(m)
<re.Match object; span=(0, 21), match='hieroglyphs@gmail.com'>

返回非空的 Match 对象则说明匹配成功,返回 None 则匹配失败

Python 中 re 模块常用的函数(p 为正则表达式,string 为字符串):

  • search(p, string) 查找字符串,返回非空的 Match 对象则说明匹配成功,返回 None 则匹配失败
  • findall(p, string) 查找字符串,如果找到会返回所有匹配到的字符串列表,如果找不到则返回 None
  • sub(p, repl, string, count=0) 字符串替换,repl 是用于替换的新字符串,string 是要被替换的字符串,count 是要替换的最大数量,默认为 0,表示不限制数量
  • split(p, string, maxsplit=0) 字符串分割,maxsplit 表示最大分割次数,默认为 0,表示不限制次数

正则表达式语法

  • 限定符

    • a* a 出现 0 次或多次
    • a+ a 出现 1 次或多次
    • a? a 出现 0 次或多次
    • a{6} a 出现 6 次
    • a{2,6} a 出现 2-6 次
    • a{2,} a 出现 2 次以上
  • 或运算符

    • (a|b) 匹配 a 或 b
    • (ab)|(cd) 匹配 ab 或 cd
  • 字符类

    • [abc] 匹配 a 或 b 或 c
    • [a-c] 匹配 a 或 b 或 c
    • [a-fA-F0-9] 匹配所有小写字母、大写字母及数字或它们的组合
    • [^0-9] 除了数字其它都匹配
  • 元字符

    • \d 匹配数字字符(0-9)
    • \D 匹配非数字字符
    • \w 匹配单词字符(英文、数字、下划线)
    • \W 匹配非单词字符
    • \s 匹配空白符(包括换行符、Tab 制表符)
    • \S 匹配非空白符
    • . 匹配任意字符(换行符除外)
    • \bword\b \b 标注字符的边界(全字匹配)
    • ^ 匹配行首
    • **$**匹配行尾
  • 贪婪/懒惰匹配

    • <.+> 默认贪婪匹配“任意字符”
    • <.+?> 懒惰匹配“任意字符”

例子

匹配下列文本中的 IP 地址

255.255.255.1
255.255.0.1
256.256.255.1
256.256.255
abcd.efg.hig.c
giduihda
19216801
192.16801
192.168.0.1
10.32.14.754
4.2.2.1

正则表达式

\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\b

Python 运行程序

在 Python 正则表达式中,括号是用来捕获组的,只有通过括号捕获的部分才会被 findall 函数返回,所以需要先把括号展开再查找字符串

import re
p = r'\b(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\b'
string = '''
255.255.255.1
255.255.0.1
256.256.255.1
256.256.255
abcd.efg.hig.c
giduihda
19216801
192.16801
192.168.0.1
10.32.14.754
4.2.2.1
'''
print(re.findall(p,string))