正则表达式

  • re模块
re.matchre.match(pattern, string, flags=0)re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.searchre.search(pattern, string, flags=0)re.search 扫描整个字符串并返回第一个成功的匹配。
re.findallre.findall(string[, pos[, endpos]])在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

注: match 和 search 是匹配一次 findall 匹配所有。

re.finditerre.finditer(pattern, string, flags=0)在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
re.splitre.split(pattern, string[, maxsplit=0, flags=0])split 方法按照能够匹配的子串将字符串分割后返回列表

:re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

            
                import re

                line = "Cats are smarter than dogs";

                matchObj = re.match( r'dogs', line, re.M|re.I)
                if matchObj:
                   print ("match --> matchObj.group() : ", matchObj.group())
                else:
                   print ("No match!!")

                matchObj = re.search( r'dogs', line, re.M|re.I)
                if matchObj:
                   print ("search --> matchObj.group() : ", matchObj.group())
                else:
                   print ("No match!!")
            
        
  • 检索和替换:re.sub(pattern, repl, string, count=0, flags=0)
    1. pattern : 正则中的模式字符串。
    2. repl : 替换的字符串,也可为一个函数。
    3. string : 要被查找替换的原始字符串。
    4. count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
    5. flags : 编译时用的匹配模式,数字形式。
    6. 前三个为必选参数,后两个为可选参数。
  • compile函数:compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。 语法格式为:re.compile(pattern[, flags])
    1. pattern : 一个字符串形式的正则表达式
    2. flags 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
    3. re.I 忽略大小写
      • re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
      • re.M 多行模式
      • re.S 即为' . '并且包括换行符在内的任意字符(' . '不包括换行符)
      • re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
      • re.X 为了增加可读性,忽略空格和' # '后面的注释
            
                >>> import re
                >>> pattern = re.compile(r'\d+')                    # 用于匹配至少一个数字
                >>> m = pattern.match('one12twothree34four')        # 查找头部,没有匹配
                >>> print m
                None
                >>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配
                >>> print m
                None
                >>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
                >>> print m                                         # 返回一个 Match 对象
                <_sre.SRE_Match object at 0x10a42aac0>
                >>> m.group(0)   # 可省略 0
                '12'
                >>> m.start(0)   # 可省略 0
                3
                >>> m.end(0)     # 可省略 0
                5
                >>> m.span(0)    # 可省略 0
                (3, 5)


                //在上面,当匹配成功时返回一个 Match 对象,其中:
                //      group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);
                //      start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
                //      end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
                //      span([group]) 方法返回 (start(group), end(group))。
            
        
            
                >>> import re
                >>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)   # re.I 表示忽略大小写
                >>> m = pattern.match('Hello World Wide Web')
                >>> print m                               # 匹配成功,返回一个 Match 对象
                <_sre.SRE_Match object at 0x10bea83e8>
                >>> m.group(0)                            # 返回匹配成功的整个子串
                'Hello World'
                >>> m.span(0)                             # 返回匹配成功的整个子串的索引
                (0, 11)
                >>> m.group(1)                            # 返回第一个分组匹配成功的子串
                'Hello'
                >>> m.span(1)                             # 返回第一个分组匹配成功的子串的索引
                (0, 5)
                >>> m.group(2)                            # 返回第二个分组匹配成功的子串
                'World'
                >>> m.span(2)                             # 返回第二个分组匹配成功的子串索引
                (6, 11)
                >>> m.groups()                            # 等价于 (m.group(1), m.group(2), ...)
                ('Hello', 'World')
                >>> m.group(3)                            # 不存在第三个分组
                Traceback (most recent call last):
                  File "<stdin>", line 1, in <module>
                IndexError: no such group
            
        
  • 正则表达式模式

      模式字符串使用特殊的语法来表示一个正则表达式: 字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。 多数字母和数字前加一个反斜杠时会拥有不同的含义。 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。 反斜杠本身需要使用反斜杠转义。 由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于 \\t )匹配相应的特殊字符。

^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*匹配0个或多个的表达式。
re+匹配1个或多个的表达式。
re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}匹配n个前面表达式。例如,"o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的两个o。
re{ n,}精确匹配n个前面表达式。例如,"o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o。"o{1,}"等价于"o+"。"o{0,}"则等价于"o*"。
re{ n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b匹配a或b
(re)匹配括号内的表达式,也表示一个组
(?imx)正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx)正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re)类似 (...), 但是不表示一个组
(?imx: re)在括号中使用i, m, 或 x 可选标志
(?-imx: re)在括号中不使用i, m, 或 x 可选标志
(?#...)注释.
(?= re)前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re)前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功。
(?> re)匹配的独立模式,省去回溯。
\w匹配数字字母下划线
\W匹配非数字字母下划线
\s匹配任意空白字符,等价于 [\t\n\r\f]。
\S匹配任意非空字符
\d匹配任意数字,等价于 [0-9]。
\D匹配任意非数字
\A匹配字符串开始
\Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z匹配字符串结束
\G匹配最后匹配完成的位置。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等。匹配一个换行符。匹配一个制表符, 等
\1...\9匹配第n个分组的内容。
\10匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

深浅拷贝

赋值

  • 直接赋值拷贝,比如:a=b
    1. 数字和字符串在内存中是同一块地址
    2. 字典、列表、元组等其他类型也是同一块内存地址,不发生变化

浅拷贝

  • 浅拷贝需要导入copy模块,并调用其copy方法。比如:b = copy.copy(a)
    1. 数字和字符串在内存中是同一块地址
    2. 无嵌套的列表和字典,如a=[1,2,3]或a={'username':'zhangsan','password':123},内存地址会改变
    3. 无嵌套的元组,如a=(1,2,3),在内存中是同一块地址
    4. 字典中嵌套列表,如a= {'username':'zhangsan','password':123,'code':[1,2,3]},第一层的内存地址会改变,其他的内存地址不发生改变。看下图可以比较清楚了解。

深拷贝

浅拷贝需要导入copy模块,并调用其deepcopy方法。比如:b = copy.deepcopy(a).深拷贝的话记住一点:一定会每层重新新开辟一块内存,但是最里边的最小元素,如zhangsan,123,[1,2,3],不会发生改变。

            
                import copy
                a = [1, 2, 3, 4, ['a', 'b']] #原始对象

                b = a                       #赋值,传对象的引用
                c = copy.copy(a)            #对象拷贝,浅拷贝
                d = copy.deepcopy(a)        #对象拷贝,深拷贝

                a.append(5)                 #修改对象a
                a[4].append('c')            #修改对象a中的['a', 'b']数组对象

                print( 'a = ', a )
                print( 'b = ', b )
                print( 'c = ', c )
                print( 'd = ', d )


                //以上实例执行输出结果为:
                ('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
                ('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
                ('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
                ('d = ', [1, 2, 3, 4, ['a', 'b']])
            
        

JSON 数据解析

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:

  • json.dumps(): 对数据进行编码。
  • json.loads(): 对数据进行解码。
dictobject
list, tuplearray
strstring
int, float, int- & float-derived Enumsnumber
Truetrue
Falsefalse
Nonenull
objectdict
arraylist
stringstr
number(int)int
number(real)float
trueTrue
falseFalse
nullNone
            
                import json

                # Python 字典类型转换为 JSON 对象
                data = {
                    'no' : 1,
                    'name' : 'Runoob',
                    'url' : 'http://www.runoob.com'
                }

                json_str = json.dumps(data)
                print ("Python 原始数据:", repr(data))
                print ("JSON 对象:", json_str)


                //执行以上代码输出结果为:
                Python 原始数据: {'url': 'http://www.runoob.com', 'no': 1, 'name': 'Runoob'}
                JSON 对象: {"url": "http://www.runoob.com", "no": 1, "name": "Runoob"}
            
        

Python3 日期和时间

Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。 Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。 时间间隔是以秒为单位的浮点小数。 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示。

获取当前时间

            
                import time

                localtime = time.localtime(time.time())
                print ("本地时间为 :", localtime)
            
        

获取格式化的时间

            
                import time

                localtime = time.asctime( time.localtime(time.time()) )
                print ("本地时间为 :", localtime)
            
        

格式化日期

            
                import time

                # 格式化成2016-03-20 11:45:39形式
                print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

                # 格式化成Sat Mar 28 22:24:24 2016形式
                print (time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))

                # 将格式字符串转换为时间戳
                a = "Sat Mar 28 22:24:24 2016"
                print (time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y")))
            
        
    python中时间日期格式化符号:
  • %y 两位数的年份表示(00-99)
  • %Y 四位数的年份表示(000-9999)
  • %m 月份(01-12)
  • %d 月内中的一天(0-31)
  • %H 24小时制小时数(0-23)
  • %I 12小时制小时数(01-12)
  • %M 分钟数(00=59)
  • %S 秒(00-59)
  • %a 本地简化星期名称
  • %A 本地完整星期名称
  • %b 本地简化的月份名称
  • %B 本地完整的月份名称
  • %c 本地相应的日期表示和时间表示
  • %j 年内的一天(001-366)
  • %p 本地A.M.或P.M.的等价符
  • %U 一年中的星期数(00-53)星期天为星期的开始
  • %w 星期(0-6),星期天为星期的开始
  • %W 一年中的星期数(00-53)星期一为星期的开始
  • %x 本地相应的日期表示
  • %X 本地相应的时间表示
  • %Z 当前时区的名称
  • %% %号本身

获取某月日历

            
                import calendar

                cal = calendar.month(2016, 1)
                print ("以下输出2016年1月份的日历:")
                print (cal)
            
        
01-05 05:48
查看更多