regular

regular.py

import re

# .
# 只能匹配一个字母,而不是2个或0个

# \
# 转义
# 'abc\\.com' r'abc\.com'

# 字符集[]
# 匹配他所包括的任意字符
# '[pj]y' 匹配 'py'和 'jy'
# [a-z]  [a-zA-Z0-9]
# 反转字符集 [^abc] 匹配除了a,b,c意外的字符
# 需要转义:^出现在开头,-和]出现在末尾

# 字符串开始^
# 字符串结尾$

# 选择符,子模式 |
# 'py|abc' 匹配py 和 abc
# 'p(aaa|bbb)'

# 可选项和重复子模式
# 在子模式后加问号,变成可选项。问号表示子模式可以出现1次或不出现
# r'(http://)?(www\.)?python\.org'
# (pattern)*         重复0次,或多次
# (pattern)+         重复1次或多次
# (pattern){m,n}     重复m~n次

# re 模块重要函数
# compile,search,match,split,findall,sub,escape P194
# re.search 寻找第一个匹配的子字符串,返回True,False
# re.match 从给定字符串的开头,匹配正则表达式
m = re.match(r'\[(.*)\]', 'www[aa]cc')  # [不在开头,所以不能匹配
                                            #[]加转义\,否则代表字符集
if m:
    print(m.group(1))
m = re.match(r'.*\[(.*)\]', 'www[aa]cc')
if m:
    print(m.group(1))

# re.findall 以列表,返回给定模式的所有匹配项
print(re.findall('[a-zA-Z]+', '"as...oo--as you it?"he said,fd.'))
print(re.findall(r'["\-.?]+', '"as...oo--as you it?"he said,fd.'))
print(re.findall(r'\[(.*)\]', 'www[aa]cc[,,]cc[mm0]11S'))  # ['aa]cc[,,]cc[mm0']
print(re.findall(r'\[(.*?)\]', 'www[aa]cc[,,]cc[mm0]11S'))  # 非贪婪,得到正确的

# re.escape 对字符串中所有可能被解释为正则运算符的字符,进行转义
print(re.escape('www.pp.com'))  # www\.pp\.com

# 匹配对象和 组
# group,start,end,span
# group 获取给定子模式(组)的匹配项
# start 返回给定组的匹配项的开始位置
# end 返回给定组的匹配项的开始位置
# span  返回一个组的开始和结束位置
m = re.match(r'www\.(.*)\..{3}', 'www.python.org')
print(m.group(1))  # python
print(m.start(1))  # 4
print(m.end(1))  # 10
print(m.span(1))  # (4,10)
m = re.match(r'www\.(.*)\..{3}', 'awww.python.org')  # 不能匹配,match是在字符串开始处查找

# re.sub 使用给定的替换内容将匹配模式的子字符串替换掉
print(re.sub('{name}', 'abc', 'hello {name}...'))  # hello abc...
# 作为替换的组号和函数
# re.sub 强大功能,在替换内容中以'\\n'形式出现的任何转义序列都会被模式中与组n匹配的字符串替换掉
# 例如要把'*something*' 用 '<em>something</em>' 替换掉
pat = r'\*([^\*]+)\*'  # []字符集,^反转除了*以外的字符
print(re.sub(pat, r'<em>\1</em>', 'Hello,*world*!'))  # Hello,<em>world</em>!
# re.sub高级,模板,见regular_test.py

# 给正则表达式加注释
# 在re 函数中使用VERBOSE 标志
pat = re.compile(r'''
    \*  #comment1
    (   #start group
    [^\*]+  #get group
    )   #end group
    \*  #end
''', re.VERBOSE)

 

 

regular_test.py

#运行 python regular_test.py magnux.txt template.txt
import fileinput,re
pat=re.compile(r'\[(.+?)\]')    #非贪婪
scope={}
def replace(a):
    code=a.group(1)
    try:
        return str(eval(code,scope))
    except SyntaxError:
        exec(code,scope)
        return ''

lines=[]
for line in fileinput.input():
    lines.append(line)

text=''.join(lines)
print(text)
print(pat.sub(replace,text))    #因为magnus.txt中是赋值,所以replace没有返回str 而是exec,
                                #所以没有打印 

    

magnus.txt

[name='tttttt']
[email  =  'aaaa.com']
[langue = 'python']

template.txt

[import time]
Dear [name],
the [langue] asdf asdf asdf
[email]
[time.asctime()]

[x=1]
[y=2]
sum of [x] and [y] is [x+y]

 

posted @ 2016-06-26 15:01  *飞飞*  阅读(225)  评论(0编辑  收藏  举报