11.6. 正则表达式举例

11.6.1. 代码示例

#!/usr/bin/env python
#-*- coding:utf8 -*-
"""
函数定义必须以 def 开头,def 后跟一个空格就是函数名
python变量通过匹配单词后接“=”的情况查找变量名
变量名与“=”之间有一空格
.       #匹配单个字符
*       #匹配位于*之前的0个或多个字符
+       #匹配位于+之前的一个或多个字符
|       #会匹配位于|之前或者之后的字符
^       #匹配行首
$       #匹配行尾
?       #匹配位于?之前的零个或一个字符
\       #表示位于\之后的为转义字符
[]      #匹配位于[]中的任何一个字符如r[ae]d会匹配"rad","red等
()      #将位于()内的内容当作一个整体
{}      #按{}中的次数进行匹配
\d      #匹配一个数字字符
\D      #匹配一个非数字字符
\n      #匹配一个换行符
\r      #匹配一个回车符
\s      #匹配任何空白字符,包括空格、制表符、换页符等,等价于[\f\n\r\t\v]
\S      #匹配任何非空白字符,等价于[^\f\n\r\t\v]
\t      #匹配一个制表符
\w      #匹配包括下划线的任何单词字符,等价于"[A-Za-z0-9]"
\W      #匹配任何非单词字符,登记于"[A-Za-z0-9]"


"""
import re
import sys
def DealWithFunc(s):
    r = re.compile(r'''
                   (?<=def\s)               #前边必须含有def且def后跟一个空格
                   \w+                      #匹配函数名
                   \(.*?\)                  #匹配参数
                   (?=:)                    #后边必须跟一个:
                   ''',re.X | re.U)         #设置编译选项,忽略模式中的注释
    return r.findall(s)


def DealWithVar(s):
    vars = []                       #定义一个列表,分两种情况处理
    r = re.compile(r'''
                    \b              #匹配单词开始
                    \w+             #匹配变量名
                    (?=\s=)         #处理为变量赋值的情况
                    ''',re.X | re.U)
    vars.extend(r.findall(s))
    r = re.compile(r'''
                    (?<=for\s)      #处理变量位于for语句中的情况
                    \w+             #匹配变量名
                    \s              #匹配空格
                    (?=in)          #匹配in
                    ''',re.X|re.U)  #设置编译选项,忽略模式中的注释
    vars.extend(r.findall(s))
    return vars

if len(sys.argv) ==1:           #判断命令行是否有输入,没有则要求输入要处理的文件
    sour = input("请输入要处理的文件路径:")
else:
    sour = sys.argv[1]

file = open(sour,encoding="utf-8")  #打开文件
s = file.readlines()        #将文件读入到s中
file.close()
print("*"*100)
print(sour, "中的函数有: ")
print("*"*100)
i = 0           #i为函数所在的行号
#循环处理每一行,匹配函数并输出函数所在的行号,以及函数的原型
for line in s:
    i +=1
    function = DealWithFunc(line)
    if len(function) == 1:
        print("Line:",i,"\t",function[0])
print("*"*100)
print(sour, '中的变量有:')
print("*"*100)
i = 0
#循环处理每一行,匹配其中的变量,输出变量所在的行号,以及变量名
for line in s:
    i +=1
    var = DealWithVar(line)
    if len(var) ==1:
        print("Line:", i, '\t', var[0])