python正则匹配

Python提供了re库用于实现字符串的正则匹配。

基本使用

常用编程接口:

match,search函数返回的是match对象,而findall/finditer返回的是match对象列表(迭代器)。

常用的flag取值:

在模式中可用小括号给匹配内容加标记进行分组,通过match对象的group方法进行提取。

match对象:

应用举例

例1:检查输入是否为有效的变量标识符。

import sys, re
pat = re.compile("^[a-zA-Z_][a-zA-Z0-9_]*$");
for line in sys.stdin:
    if re.search(pat, line):
        print('ok')
    else:
        print('nok')

例2:从Markdown文件中提取图片链接

import re, sys
pat = re.compile(r'!\[.*\]\((.*)\)')
with open(sys.argv[1], 'rt') as f:
    for i in re.findall(pat, f.read()):
        print(i)

例3:找出文件中以元音字符开头的单词,去重后按字典序输出。

import re
pat = re.compile(r'[aeiou][a-z]*', re.I)
words = set()
with open('data') as f:
    for word in re.findall(pat, f.read()):
        words.add(word)
for word in sorted(words):
    print(word)

例4:分组提取ip地址

import re
pat = re.compile(r'(\d+).(\d+).(\d+).(\d+)')
with open('data') as f:
    txt = f.read().splitlines()
    for ip in txt:
        mat = re.search(pat, ip)
        print("====", ip, "====")
        print("group():", mat.group())
        print("group(1):", mat.group(1))
        print("group(2):", mat.group(2))
        print("groups():", mat.groups())

运行结果:

==== 118.26.66.138 ====
group(): 118.26.66.138
group(1): 118
group(2): 26
groups(): ('118', '26', '66', '138')
==== 172.16.1.186 ====
group(): 172.16.1.186
group(1): 172
group(2): 16
groups(): ('172', '16', '1', '186')

常用技巧

Table of Contents