zoukankan      html  css  js  c++  java
  • 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]
  • 相关阅读:
    ASP.NET AJAX Sys未定义的解决方法
    幽默中的人生哲理
    我们总是试图抹去一些东西,比如记忆。然而,一切只是徒然。
    在webbrowser中操作js弹出的对话框 以及触发其它事件····
    Asp.Net :写入 、读取 、 删除、追加cookie数组?
    揭开ASP.NET中Cookie编程的奥秘
    多线程调度例子·····················
    winform编程——做过ini配置文件创建文件、添加配置项,修改配置项,删除配置项
    C# 比较二个时间差。Environment.TickCount
     WebBrowser控件捕捉DHTML事件
  • 原文地址:https://www.cnblogs.com/feifeidxl/p/5617908.html
Copyright © 2011-2022 走看看