Python相关文档
0.1. Python标准文档
0.2. Python实用大全
0.3. 迷人的Python
0.4. 深入理解Python
0.5. Python扩展库网址 http://pypi.python.org/
     Python官方网址 http://www.python.org/

列表

  用[]括起来,里面可以是数值或bool或字符串

  L = [95.5,85,59,True,"Last"]
  print L[0]
  print L[2]
  print L[1]
  print L

  插入:L.insert(pos, Data)

  追加:L.append(Data)

  删除:L.pop(pos)

  字符串可以通过 % 进行格式化,用指定的参数替代 %s。字符串的join()方法可以把一个 list 拼接成一个字符串。

元组

  用()括起来,里面可以是数值或bool或字符串;

  tuple一旦创建完毕,就不能修改了;

  创建tuple和创建list唯一不同之处是用( )替代了[ ];

  单元素 tuple 要多加一个逗号“,”,避免做为函数处理的歧义;

  空元组 t = ()

  一个元素的元组 t = (12421,)

  可变元组:元组中的一个元素是列表(列表的内容可变,类型不能变)

切片

  L[0:3:1]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。

  L[:]实际上复制出了一个新list。

  第三个参数表示每N个取一个,上面的 L[::2] 会每两个元素取出一个来,也就是隔一个取一个。

  把list换成tuple,切片操作完全相同,只是切片的结果也变成了tuple。

可以对list tuple 字符串切片

字典,映射

  Python的 dict 就是专门干这件事的。用 dict 表示“名字”-“成绩”的查找表如下:

  d = {
  'Adam': 95,
  'Lisa': 85,
  'Bart': 59
  }

  我们把名字称为key,对应的成绩称为value,dict就是通过key 来查找 value

  花括号 {} 表示这是一个dict,然后按照 key: value, 写出来即可。最后一个 key: value 的逗号可以省略。

  由于dict也是集合,len() 函数可以计算任意集合的大小

  list 必须使用索引返回对应的元素,而dict使用key

  dict的第一个特点是查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。

  dict的第二个特点就是存储的key-value序对是没有顺序的!

  dict的第三个特点是作为 key 的元素必须不可变,Python的基本类型如字符串、整数、浮点数都是不可变的,都可以作为 key。但是list是可变的,就不能作为 key。

  遍历字典:

  for key in d:

    print key,d[key]

  dict 对象有一个 values() 方法,这个方法把dict转换成一个包含所有value的list,这样,我们迭代的就是 dict的每一个 value:

  items() 方法把dict对象转换成了包含tuple的list,我们对这个list进行迭代,可以同时获得key和value:

  >>> for key, value in d.items():
  ... print key, ':', value

for in 可以遍历列表,元组,集合和字典,使用 enumerate() 函数,我们可以在for循环中同时绑定索引index和元素name。

  列表生成式的 for 循环后面还可以加上 if 判断

  def toUppers(L):
    return [x.upper() for x in L if isinstance(x, str)]

  print toUppers(['Hello', 'world', 101])

  例如:利用 3 层for循环的列表生成式,找出对称的 3 位数。例如,121 就是对称数,因为从右到左倒过来还是 121。

  print [x*100+y*10+z for x in range(1,10) for y in range(0,10) for z in range(1,10) if x == z]

  zip()函数可以把两个 list 变成一个 list:

  >>> zip([10, 20, 30], ['A', 'B', 'C'])
  [(10, 'A'), (20, 'B'), (30, 'C')]

集合Set

  set 持有一系列元素,这一点和 list 很像,但是set的元素没有重复,而且是无序的,这点和 dict 的 key很像。

  创建 set 的方式是调用 set() 并传入一个 list,list的元素将作为set的元素:

  ([])表示一个集合

  >>> s = set(['A', 'B', 'C'])
用in操作符判断是否在集合里面。
增加和删除:add/remove

函数

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
print map(format_name, ['adam', 'LISA', 'barT'])
reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
sorted()也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。

装饰器:

  相当于Java里面的AOP切面。


1. if,python中没有switch语句
    if(a+1==b):
        print("if");
    elif(a+1>b):
        print("elif");
    else:
        print("else");

2.while语句有else部分,while/for语句中出现break时,else不执行
    running=True;
    while(running):
        if(i>10):
            running=False;
        print(i);
        i+=1;
    else:
        print("end while");

3.Boolean的值有 True 和 False

4.for ..in 语句,range(start,end,step)
    for i in range(0,10):
        print (i);
    else:
        print("end for");

5.continue和,break语句从for或while循环中结束,循环的else块将不执行

6.标准输入
    s=input("Enter a string:");
    6.1.格式化字符串
        a=10
        b='string'
        c='a:%d,b:%s'%(a,b)

7.函数 有关键字def定义
    #define function say()
    def say():
        print("function say()");
    #call the function
    say();

7.1.函数形参
        #define function say(a,b)
        def say(a,b):
            print("function say()",a,b);
        #call the function
        say(a,b);

7.2.默认参数值
        #define function say(a,b)
        def say(a,b=0):
            print("function say()",a,b);

#call the function
        say(a,b);
        say(a)

7.3.关键参数 指定其中一部分参数
        #define function say(a,b,c,d)
        def say(a,b=0,c=1,d=2):
            print("function say()",a,b,c,d);

#call the function
        say(a,c=100);
        say(a,b=2,d=3)

7.4.return语句
        def max(a,b):
            if(a>b):
                return a;
            else:
                return b;

#call
        print max(a,b);

7.5.元组,列表,字典作为函数的参数
        元组或列表
        def powersum(power, *args):
            total=0
            for i in args:
                total+=pow(i,power)
            return total

print (powersum(2,3,4))
        print (powersum(2,10))

  可变参数也不是很神秘,Python解释器会把传入的一组参数组装成一个tuple传递给可变参数,因此,在函数内部,直接把变量 args 看成一个 tuple 就好了。

8.全局变量与局部变量
    def func():
        global x;
        print ("x is",x);
        x=100;
    #call the func()
    x=200;
    func();
    print (x);

9.DocStrings文档字符串
    def docs():
        '''this is a description of
        function docs()'''
        print ("docs()");

print (docs.__doc__);

10.命令行参数
    import sys;

#sys.argv[0] 为命令本身,for语句从sys.argv[0]开始
    #sys.argv为命令行参数列表
    for i in sys.argv:
        print (i);

11.模块
  11.1.模块的__name__
  if (__name__=='__main__'):
      print ("main");
  else:
      print ("be imported from another module");

11.2.模块的创建
    #!user/bin/python
    #filename:mymodule.py

if (__name__=='__main__'):
        print ('my module main');
    else:
        print ('my module is imported');

def func():
        print ('my module func()');
    version='0.0.1';

#import in another py file
    import mymodule;
    mymodule.func();
    print (mymodule.version)

#or
    from mymodule import func,version;
    func();
    print ('Version:',version);

11.3.模块函数dir() 列出此模块中定义的函数,类和变量
    import sys
    for i in dir(sys):
        print (i)

12.数据结构 列表list, 通过中括号中逗号分隔的item定义
    yourlist=['y1','y2','y3','y4','y5']
    mylist=list();
    mylist.append('1');
    mylist.append('2');
    mylist.append('3');
    mylist.append('4');

mylist.insert(mylist.count('1'),'5')
    mylist.extend('6');
    print (mylist.index('5'))
    print (mylist[1])
    #mylist.reverse();
    #mylist.sort(key=None, reverse=True)
    for i in mylist:
        print (i)

12.1.序列 - 代表倒数第几个index
        #all items in list
        mylist[0:-1]
        mylist[:]
        mylist[0:]

#除最后一个的所有序列
        mylist[:-1]

13.数据结构 元组tuple,和字符串一样值不可变,通过圆括号中用逗号分隔的项目定义
    mytuple=('1','2','3','4','5','4')

print (mytuple.count('4'))
    print (mytuple.index('5'))
    print (mytuple[1])
    for i in mytuple:
        print (i)

14.数据结构 字典dict, 类似于map,键值对在字典中的标记方式
    d={ key1 : value1,
       key2 : value2,
       key2 : value3,
       key2 : value4
    } 键/值对用 : 分隔,各个对用 , 分隔 所有这些都包含在花括号里面
    d = {
    'w1' : 'w1@xx.com',
    'w2' : 'w2@xx.com',
    'w3' : 'w3@xx.com',
    'w4' : 'w4@xx.com',
    'w5' : 'w5@xx.com' }

#add an item
    d['w6'] = 'w6@yy.cn'

#delete an item
    del d['w3']

#access an item
    print (d['w4'])

#key and values
    for i, j in d.items():
        print (i, ':', j)
    #values
    print (d.copy().values())

15.class类 如下的代码中__init__()为构造函数, self为this指针, __del__()为析构函数
  Python不会自动调用基本类的constructor(__init__())和destructor(__del__()),你得亲自专门调用它。

class per:
        age=0
        def __init__(self, name):
            self.name=name
            print ("init name:%s"%self.name)
        def say(self):
            print ("per::say()")
        def set(self,age):
            self.age=age
        def get(self):
            return self.age
        def __del__(self):
            self.age=0
            print ("__del__()%d"%self.age)

person=per('person')
    person.say()
    person.set(100)
    print (person.get())

15.1.类的继承 class subclass(baseclass1,baseclass2,...,baseclassn)
    class base:
        name=''
        age=0
        def __init__(self,name,age):
            self.name=name
            self.age=age
            print ('base::__init__():name:%s,age:%d' \
                    %(self.name,self.age))
        def tell(self):
            print ('base::name:%s,age:%d'%(self.name,self.age))
        def __del__(self):
            self.name=''
            self.age=0
            print ('base::__del__()')

class suba(base):
        sex=''
        def __init__(self,name,age,sex='man'):
            self.sex=sex
            base.__init__(self,name,age)
            print ('suba::__init__():name:%sage:%dsex:%s' \
                    %(self.name,self.age,self.sex))
        def __del__(self):
            base.__del__(self)
            print ('suba::__del__()')

a=suba('wangyf',25,'man')
    a.tell()

16.异常处理 try...except
    import sys

try:
        s=input('Enter ctrl+c to test EOFError:')
        Print ('Print is not defined')
    except EOFError:
        print ('EOF is Entered')
    except Exception:
        print ('default Exception')
    else:
        print ('no Exception happened')

16.1.引发异常 raise 相当于在可能异常的地方调用异常类,相当于throw
  可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类

class InputException(Exception):
        def __init__(self,x):
            self.x=x
            print ('InputException::__init__():x:[%d]'%self.x)
        def __del__(self):
            print ('InputException::__del__()')
    try:
        s=input('Enter some word:')
        if(len(s) < 5):
            print ('string len is:%d'%(len(s)))
            #throw a exception
            raise InputException(len(s))
    except EOFError:
        print ('EOF is Entered')
    except Exception:
    #上面的异常此处也会捕获到
        print ('except')
    else:
        print ('else')

16.2.try...finally异常处理
    无论异常发生与否的情况下,finally范围里的语句都会被执行
    try:
        s=input('Enter string:')
    finally:
        print ('str s is:%s'%s)

17.exec和eval执行引号里面的语句
    exec ('print ('this is exec command')')
    eval ('print ('this is eval command')')

18.lambda形式
    lambda语句被用来创建新的函数对象,并且在运行时返回它们。
    def repeater(n):
        return lambda s:s*n

three=repeater(3)
    print (three('main')

19. others
  19.1. 引号'"在python中没有区别。即 '' == "", \''' ''' == \""" """指示多行的字符串。
  19.2. python中的标识符与c语言一样。
  19.3. pass语句在Python中表示一个空的语句块。
  19.4. from sys import * == import sys :即在模块sys中导入子模块。

20. python调用c的库文件文件
    20.1. c函数编译成动态库文件
    /* test.cpp */
    #include <stdio.h>

extern "C" {
        void display() {
            printf("This is Display Function\n");
        }
    }
    编译成动态库文件。
    g++ test.cpp -fPIC -shared -o libtest.so

20.1. python调用
    import ctypes
    so = ctypes.CDLL("./libtest.so")
    so.display()

21. python连接oracle数据库
  使用库文件cx_Oracle-5.1.tar.gz
  Python扩展库网址 http://pypi.python.org/获取库文件
  编译方式
  python setup.py build
  python setup.py install

#! /export/home/wangyf/tools/python2.7.2/bin/python
    #coding=UTF-8

import cx_Oracle

def hello():
        '''Hello cx_Oracle示例:

1)打印数据库版本信息.
        2)查询表数据.'''

conn = cx_Oracle.connect("obs61","obs61","tx8i.hp")
        cur = conn.cursor()
        try:
            print "Oracle Version:%s" % conn.version
            print "Table SUB_POLICY rows:"
            cur.execute('select * from wlan_future_event')
            for row in cur:
                print row
        finally:
            cur.close()
            conn.close()

hello()

22. python连接mysql数据库
  使用库文件MySQLdb MySQL-python-1.2.3.tar.gz
  Python扩展库网址 http://pypi.python.org/获取库文件
  基本的使用如上,还是很简单的,进一步使用还没操作,先从网上找点资料放上来,以备后续查看

# -*- coding: utf-8 -*-
    #mysqldb
    import time, MySQLdb

#连接
    conn=MySQLdb.connect(host="localhost",user="root",passwd="",db="test",charset="utf8")
    cursor = conn.cursor()

#写入
    sql = "insert into user(name,created) values(%s,%s)"
    param = ("aaa",int(time.time()))
    n = cursor.execute(sql,param)
    print n

#更新
    sql = "update user set name=%s where id=3"
    param = ("bbb")
    n = cursor.execute(sql,param)
    print n

#查询
    n = cursor.execute("select * from user")
    for row in cursor.fetchall():
    for r in row:
        print r

#删除
    sql = "delete from user where name=%s"
    param =("aaa")
    n = cursor.execute(sql,param)
    print n
    cursor.close()

#关闭
    conn.close()

22.1.引入MySQLdb库
    import MySQLdb

22.2.和数据库建立连接
     conn=MySQLdb.connect(host="localhost",user="root",passwd="sa",db="mytable",charset="utf8")
     提供的connect方法用来和数据库建立连接,接收数个参数,返回连接对象.

比较常用的参数包括
     host:数据库主机名.默认是用本地主机.
     user:数据库登陆名.默认是当前用户.
     passwd:数据库登陆的秘密.默认为空.
     db:要使用的数据库名.没有默认值.
     port:MySQL服务使用的TCP端口.默认是3306.
     charset:数据库编码.

更多关于参数的信息可以查这里
     http://mysql-python.sourceforge.net/MySQLdb.html

然后,这个连接对象也提供了对事务操作的支持,标准的方法
     commit() 提交
     rollback() 回滚

22.3.执行sql语句和接收返回值
     cursor=conn.cursor()
     n=cursor.execute(sql,param)
     首先,我们用使用连接对象获得一个cursor对象,接下来,我们会使用cursor提供的方法来进行工作.这些方法包括两大类:1.执行命令,2.接收返回值

cursor用来执行命令的方法:
     callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
     execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
     executemany(self, query, args):执行单条sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
     nextset(self):移动到下一个结果集

cursor用来接收返回值的方法:
     fetchall(self):接收全部的返回结果行.
     fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
     fetchone(self):返回一条结果行.
     scroll(self, value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果mode='absolute',则表示从结果集的第一行移动value条.

下面的代码是一个完整的例子.
     #使用sql语句,这里要接收的参数都用%s占位符.要注意的是,无论你要插入的数据是什么类型,占位符永远都要用%s
     sql="insert into cdinfo values(%s,%s,%s,%s,%s)"
     #param应该为tuple或者list
     param=(title,singer,imgurl,url,alpha)
     #执行,如果成功,n的值为1
     n=cursor.execute(sql,param)

#再来执行一个查询的操作
     cursor.execute("select * from cdinfo")
     #我们使用了fetchall这个方法.这样,cds里保存的将会是查询返回的全部结果.每条结果都是一个tuple类型的数据,这些tuple组成了一个tuple
     cds=cursor.fetchall()
     #因为是tuple,所以可以这样使用结果集
     print cds[0][3]
     #或者直接显示出来,看看结果集的真实样子
     print cds

#如果需要批量的插入数据,就这样做
     sql="insert into cdinfo values(0,%s,%s,%s,%s,%s)"
     #每个值的集合为一个tuple,整个参数集组成一个tuple,或者list
     param=((title,singer,imgurl,url,alpha),(title2,singer2,imgurl2,url2,alpha2))
     #使用executemany方法来批量的插入数据.这真是一个很酷的方法!
     n=cursor.executemany(sql,param)

23. python连接其他数据库
    23.1. python连接postgreSQL数据库 py-postgresql-1.0.4.tar
    23.2. python连接sybase数据库 python-sybase 0.39
    23.3. python连接sqlite数据库pysqlite 2.6.3
    23.4. python连接mongodb数据库pymongo-2.1.1.tar.gz

24. python调用c封装的python库
    //包含python的头文件
    #include <python2.7/Python.h>
    // 1 c/cpp中的函数
    int my_c_function(const char *arg) {
        int n = system(arg);
        return n;
    }
    // 2 python 包装
    static PyObject * wrap_my_c_fun(PyObject *self, PyObject *args) {
        const char * command;
        int n;
        if (!PyArg_ParseTuple(args, "s", &command))//这句是把python的变量args转换成c的变量command
            return NULL;
        n = my_c_function(command);//调用c的函数
        return Py_BuildValue("i", n);//把c的返回值n转换成python的对象
    }
    // 3 方法列表
    static PyMethodDef MyCppMethods[] = {
        //MyCppFun1是python中注册的函数名,可以注册多个函数被python脚本调用,wrap_my_c_fun是函数指针
        { "MyCppFun1", wrap_my_c_fun, METH_VARARGS, "Execute a shell command." },
        { "MyCppFun2", wrap_my_c_fun, METH_VARARGS, "Execute a shell command 2." },
        { NULL, NULL, 0, NULL }
    };
    // 4 模块初始化方法init后面必须为库名称initMyCppModule编译的库必须命名为MyCppModule.so
    PyMODINIT_FUNC initMyCppModule(void) {
        //初始模块,把MyCppMethods初始到MyCppModule中
        PyObject *m = Py_InitModule("MyCppModule", MyCppMethods);
        if (m == NULL)
            return;
    }

g++ -shared -fPIC pythonc.cpp -I/export/home/wangyf/tools/python2.7.2/include -o MyCppModule.so

# -*- coding: utf-8 -*-
    import MyCppModule
    #导入python的模块(也就是c的模块,注意so文件名是MyCppModule
    r = MyCppModule.MyCppFun1("ls -l")
    r = MyCppModule.MyCppFun2("ls -lrt")
    print r
    print "OK"

25. c调用python
    库文件需要放在python的库目录下
    若使用当前目录下的python库函数需要加载把当前目录加载到库目录下
    PyRun_SimpleString("import sys; sys.path.append('.')");
    # pytest.py
    def add(a,b):
        print "in python function add"
        print "a = " + str(a)
        print "b = " + str(b)
        print "ret = " + str(a+b)
        return a + b

// ccallp.cpp
    #include <stdio.h>
    #include <stdlib.h>
    #include <python2.7/Python.h>

int main(int argc, char** argv)
     {
         // 初始化Python
         //在使用Python系统前,必须使用Py_Initialize对其
         //进行初始化。它会载入Python的内建模块并添加系统路
         //径到模块搜索路径中。这个函数没有返回值,检查系统
         //是否初始化成功需要使用Py_IsInitialized。

PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pRetVal;

Py_Initialize();
         // 检查初始化是否成功
         if ( !Py_IsInitialized() )
        {
             return -1;
         }

// 载入名为pytest的脚本(注意:不是pytest.py)
        // PyRun_SimpleString("import sys; sys.path.append('.')");
         pName = PyString_FromString("pytest");
         pModule = PyImport_Import(pName);
         if ( !pModule )
         {
             printf("can't find pytest.py");
             getchar();
             return -1;
         }
         pDict = PyModule_GetDict(pModule);
         if ( !pDict )
        {
             return -1;
         }

// 找出函数名为add的函数
         pFunc = PyDict_GetItemString(pDict, "add");
         if ( !pFunc || !PyCallable_Check(pFunc) )
         {
             printf("can't find function [add]");
             getchar();
             return -1;
         }

// 参数进栈
         pArgs = PyTuple_New(2);

// PyObject* Py_BuildValue(char *format, ...)
         // 把C++的变量转换成一个Python对象。当需要从
         // C++传递变量到Python时,就会使用这个函数。此函数
         // 有点类似C的printf,但格式不同。常用的格式有
         // s 表示字符串,
         // i 表示整型变量,
         // f 表示浮点数,
         // O 表示一个Python对象。

PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3));
        PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4));

// 调用Python函数
        pRetVal = PyObject_CallObject(pFunc, pArgs);
        printf("function return value : %ld\r\n", PyInt_AsLong(pRetVal));

Py_DECREF(pName);
        Py_DECREF(pArgs);
        Py_DECREF(pModule);
        Py_DECREF(pRetVal);

// 关闭Python
        Py_Finalize();
        return 0;
    }
    // sunOS下编译需要指定库文件
    g++ ccallp.cpp -I/export/home/wangyf/tools/python2.7.2/include -o ccallp -lpython2.7 -ldl -lrt
    # 结果
    /export/home/wangyf/python/learn>% ccallp
    in python function add
    a = 3
    b = 4
    ret = 7
    function return value : 7

26. python正则表达式
    26.1. 元字符. ^ $ * + ? { [ ] \ | ( )
    ".":表示任意一个字符。
        匹配的扩展名不是 "bat" 的文件名
        .*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$
    "$":表示必须以指定字符结尾。
    "|":左右表达式任意匹配一个。
    "[]":常用来指定一个字符类别,
    所谓字符类别就是你想匹配的一个字符集。
    字符可以单个列出,也可以用“-”号分隔的两个给定字符来表示一个字符区间。
    例如,[abc] 将匹配"a", "b", 或"c"中的任意一个字符;
    也可以用区间[a-c]来表示同一字符集,和前者效果一致。如果你只想匹配小写字母,re写成 [a-z].

元字符在类别里并不起作用。例如,[akm$]将匹配字符"a", "k", "m", 或 "$" 中的任意一个;"$"通常用作元字符,但在字符类别里,其特性被除去,恢复成普通字符
    "^"字符本身。例如,[^5] 将匹配除 "5" 之外的任意字符。
    "*":指定前一个字符可以被匹配零次或更多次,而不是只有一次。
    "+":表示匹配一或更多次。
        请注意 * 和 + 之间的不同;"*"匹配零或更多次,所以根本就可以不出现,而 "+"要求至少出现一次.
    "?":表示匹配零或一次。
    "{}":重复限定符是 {m,n},其中 m 和 n 是十进制整数。该限定符的意思是至少有 m 个重复,
        至多到 n 个重复。举个例子,a/{1,3}b 将匹配 "a/b","a//b" 和 "a///b"。
        {0,} 等同于 *,{1,} 等同于 +,而{0,1}则与 ?
    \d 匹配任何十进制数;它相当于类 [0-9]。
  \D 匹配任何非数字字符;它相当于类 [^0-9]。
  \s 匹配任何空白字符;它相当于类 [ "t"n"r"f"v]。
  \S 匹配任何非空白字符;它相当于类 [^ "t"n"r"f"v]。
  \w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
  \W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。
  这样特殊字符都可以包含在一个字符类中。如,["s,.]字符类将匹配任何空白字符或","或"."。

python练手基础的更多相关文章

  1. 整理了适合新手的20个Python练手小程序

    100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. 本文附带基础视频教程:私信回复[基础]就可以获取的 [程序1] ...

  2. Python练手项目:20行爬取全王者全英雄皮肤

    引言    王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. ...

  3. 80个Python练手项目列表

    80个Python练手项目列表   我若将死,给孩子留遗言,只留一句话:Repetition is the mother of all learning重复是学习之母.他们将来长大,学知识,技巧.爱情 ...

  4. 【Python精华】100个Python练手小程序

    100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同 ...

  5. Python练手项目实例汇总(附源码下载)

    今天给大家分享几个有趣的Python练手项目实例,希望对Python初学者有帮助哈~ 一.经典的俄罗斯方块   1. 绑定功能 1 # 绑定功能 2 class App(Frame): 3 def _ ...

  6. 70个Python练手项目列表(都有完整教程)

    前言: 不管学习那门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从 ...

  7. Python练手之爬虫

    很久没更新博客了,最近自学Python,写个在百度上爬算法题题解的爬虫,第一次写爬虫..纯当练手 慢慢来.. #coding:utf-8 ''' Created on 2016年11月22日 @aut ...

  8. 【转载】【python】python练手项目

    入门篇 1.Python - Python 图片转字符画 50 行 Python 代码完成图片转字符画小工具. &lt;img src="https://pic3.zhimg.com ...

  9. 别再说找不到Python练手项目了,这80个拿去过冬

    开头真的很重要!!!一个吻,一部小说,一篇文章......好的开头就像一个漂亮女孩的问候,问完了,你还期待着她接下来会对你说些什么甜蜜的话呢. 真可惜!我不是漂亮女孩,我的这个开头也不好.但开头不好, ...

随机推荐

  1. Oozie coordinator 作业自定义的配置的一些方法

    Oozie的coordinator有啥用? The Oozie Coordinator system allows the user to define and execute recurrent a ...

  2. java 经典程序 100 例

    1,编写程序,判断给定的某个年份是否是闰年.闰年的判断规则如下:( 1)若某个年份能被 4 整除但不能被 100 整除,则是闰年.( 2)若某个年份能被 400 整除,则也是闰年. import ja ...

  3. webconfig中配置各种数据库的连接字符串(转)

    一.在appSettings配置 <appSettings>   <!--SQL Server--> <!--<add key="SQLString&qu ...

  4. CWMP开源代码研究3——ACS介绍

    声明:本文涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅号:408797506) 本文介绍自己用过的ACS,其中包括开源版(提供下载包)和商业版(仅提供安装包下载 ...

  5. 快速掌握iOS API的一个小技巧

    快速掌握iOS API的一个小技巧 周银辉 iOS SDK和Developer Library中提供了各个类以及函数的帮助文档,这很棒,但要想了解整个库的大体结构(比如UIKit下有哪些类,他们的继承 ...

  6. Linux 进程间通讯详解二

    消息队列 --消息队列提供了本机上从一个进程向另外一个进程发送一块数据的方法 --每个数据块都被认为有一个类型,接收者进程接收的数据块可以有不同的类型值 --消息队列也有管道一样的不足,就是每个消息的 ...

  7. StackExchange.Redis 访问封装类

    最近需要在C#中使用Redis,在Redis的官网找到了ServiceStack.Redis,最后在测试的时候发现这是个坑,4.0已上已经收费,后面只好找到3系列的最终版本,最后测试发现还是有BUG或 ...

  8. 搭建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】

    工欲善其事必先利其器,  下面来说说代码生成器. 现在代码生成器品种繁多各式各样, 什么codesmith.T4. 动软也算.那么每款代码生成器都有自己模板解析引擎. 现在比较流行的 NVelocit ...

  9. 使用配置 API配置注入(Container stand-alone API)

    当使用API配置注时,它可以通过成员注入重写默认的注入规则: 使用注入成员(InjectionMember)时,如对属性注入可以用InjectionProperty等,可以通过指定名称来指定使用哪个具 ...

  10. Angular指令2

    scope Create a new scope for this directive rather than inheriting the parent scope. controller Crea ...