我们不能失去信仰

我们在这个世界上不停地奔跑...

0%

我的mac 电脑安装完mysql后,无法正常通过 command进行连接。

显示 error(1045) access denied for user root ‘@ localhost

解决方法如下:

阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
# coding=utf-8

# 导入re模块
import re

# 使用match方法进行匹配操作
result = re.match(匹配规则,要匹配的内容)

<!-- more -->

# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()

re.match() 是用来进行正则匹配检查的方法,若字符串匹配正则表达式,则match方法返回匹配对象(Match Object),否则返回None(注意不是空字符串””)

匹配对象Match Object具有group方法,用来返回字符串的匹配部分。

示例1:匹配以apple开头的语句:

1
2
3
4
5
6
7
8
#coding=utf-8

import re

result = re.match("apple","appleorange banana")
result.group()
# 运行结果
# apple

说明:

  • re.match() 能够匹配出以xxx开头的字符串

表示字符

字符 功能

. 匹配任意1个字符(除了\n)

[] 匹配[]中列举的字符

\d 匹配数字,即0–9

\D 匹配非数字

\s 匹配空白,即空格,tab键

\w 匹配单词字符,即a-z、A-Z、0-9、_

\W 匹配非单词字符

[^] 表示只要不是集合里的元素就可以

[a-z5-9] 表示26个字母和5、6、7、8、9

\d = [0-9]

1
2
3
4
5
6
7
8
# 表示数量
# 匹配多个字符的相关格式
* 匹配前一个字符出现0次或者无限次
+ 匹配前一个字符出现1次或者无限次
? 匹配前一个字符出现1次或者0次
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现从m到n次

示例1: 匹配出,一个字符串第一个字母为大写字符,后面都是小写字母并且这些小写字母可有可无:

1
2
3
4
5
# coding=utf-8

import re

ret = re.match("[A-Z][a-z]*")

示例2:匹配出,变量名是否有效:

1
2
3
4
5
#coding=utf-8

import re

ret = re.match("[A-Za-z_]+\w*")

示例3: 匹配出,0到99之间的数字

1
2
3
4
#coding=utf-8
import re

ret = re.match("[1-9]?\d$|^100$")

示例4:匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线

1
2
3
4
#coding=utf-8
import re

ret = ret.match("[a-zA-Z0-9_]{8,20}","1sdasfsdf2323")

原始字符串

1
2
3
4
s = '\nabc'
re.match("\\\\nabc",s)
re.match(r"\nabc",s)
# 加一个r 表示原始字符串,可以忽略需要转义的地方
  • 说明:

    python中字符串前面加上 r 表示原生字符串,与大多数编程语言相同,正则表达式里使用“"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”",那么使用编程语言表示的正则表达式里需要3个反斜杠”\\“:前两个和后两个分别用于在编程语言里转义程反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。

    python里的原生字符串很好的解决了这个问题,有了原始字符串,再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

表示边界:

字符 功能

^ 匹配字符串的开头

$ 匹配字符串的结尾

\b 匹配一个单词的边界

\B 匹配非单词边界

表示分组:

1
2
3
4
5
|					匹配左右任意一个表达式
(ab) 将括号中的字符作为一个分组
\num 引用分组num匹配到的字符串
(?P<name>) 分组起的别名
(?P=name) 引用别名为name分组匹配到的字符串

示例:

1
2
3
4
5
6
7
8
9
# 匹配出<html><h1>hello</h1></html>

import re

ret = re.match(r"<(\w*)><(\w*)>.*<(/\1)><(/\2)>","<html><h1>hello</h1></html>")
ret.group()
# 给分组设置别名
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name1)></(?P=name2)>","<html><h1>hello</h1></html>")
# 注意字母P是大写

re模块的高级用法

  • search

    如:匹配出文章阅读的次数

    1
    2
    3
    4
    5
    # coding=utf-8
    import re

    ret = re.search(r"\d+","阅读次数为 1000")
    ret.group()
  • findall

    找出所有数字信息:

    1
    2
    3
    4
    5
    #coding=utf-8
    import re

    ret = re.findall(r"\d+","a = 1 ,b = 20 ,c = 100")
    print(ret)

  • sub将匹配到的数据进行替换

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 第一种方法
    #coding=utf-8
    import re

    ret = re.sub(r"\d+",'199','read = 198')

    # 第二种 将匹配得到的结果传入函数replace中,用函数的返回值进行替换
    def replace(result):
    num = int(result)
    return str(num+1)
    re.sub(r"\d+", replace, "a = 2,b = 3")
  • split 根据匹配进行切割字符串,返回一个列表

    1
    2
    3
    4
    import re

    ret = re.split(r":| ","info:haha 22 aabbcc")
    print(ret)

python贪婪和非贪婪

python里数量词默认是贪婪的,总是尝试尽可能多匹配字符,非贪婪则相反

解决方式:非贪婪操作符”?”,这个操作符可以用在“*”,“+”,“?”的后面,要求匹配的越少越好。

题目: 构建一个类Foo 用python的魔法方法实现

class Foo()

print(Foo().welcome.hello.world)

welcome hello world

1
2
3
4
5
6
7
8
9
10
11
12
# coding=utf-8

class Foo():
def __init__(self):
pass

def __getattr__(self,item):
print(item,end=" ")
return self

def __str__(self):
return ""

题目:有一些网址,需要如

https://www.baidu.com/1123/332/as.asp?id=32

需要正则后为:

https://www.baidu.com

1
2
3
4
5
#coding=utf-8
import re

ret = re.match(r"(https://.*?)/.*",lambda x:x.group(1),"https://www.baidu.com/1123/332/as.asp?id=32")
print(ret)

题目:找出单词

apple orange banana hello world

1
2
3
4
#coding=utf-8
import re

ret = re.split(r"\s+","apple orange banana hello world")

搜索引擎关键字:

Hacked by

搜索引擎语法

  • Intitle:keyword 标题中含有关键词的网页
  • Intext:keyword 正文中含有关键词的网页
  • Site:domain 在某个域名和子域名下的网页
    阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# new 方法执行一次。
class Dog(object):
__instance = None

def __new__(cls):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
# return 上一次创建对象的引用
return cls.__instance

a = Dog()
print(id(a))
b = Dog()
print(id(b))

# 版本二 new 方法 和 init 都执行一次
class Dog(object):
__instance = None
__inin_flag = False
def __new__(cls,name):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
# return 上一次创建对象的引用
return cls.__instance
def __init__(self,name):
if Dog.__init_flag == False:
self.name = name
Dog.__init_flag = True


a = Dog("gou1")
print(a.name)
b = Dog("gou2")
print(b.name)

python异常处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#python2的异常处理
try:
print(num)
print("___1____")
except 异常的名字:
print("如果捕获到异常处理的方式")


#python3异常处理
try:
open("xxx.txt")
print("111")
except (NameError,FileNotFoundError): #多个异常用元祖
print("如果捕获到异常后的处理")
except Exception:
print("如果用了Exception,那么意味着只要上面的except没有捕获到的异常,这个except一定会捕获到")
else:
print("没有异常会执行的功能")
finally:
print("一定会执行的代码")

#python 抛出自定义异常
class ShortInputError(Exception):
def __init__(self,mlength,length):
self.maxlength = mlength
self.length = length

try:
s = input("请输入")
if len(s) > 3:
rsise ShortInputException(3,len(s))
except ShortInputException as result:
print('ShortInputException:输入字符串的长度为%d,最大长度为%d'(result.length,result.maxlength))
else:
print("没有发生异常")

导入模块

1
2
3
4
5
6
7
8
9
10
import xxx  #使用前要加导入的模块名
xxx.xx()
from xxx import aaa #使用的时候直接用aaa
aaa()
from xxx import * # 不建议使用,如果有两个类有相同名字的方法
from xxx import aaa,bbb,ccc #可以导入多个方法
import xxx as bbb #可以给模块取一个别名进行调用
bbb.xx()

#在一个模块里,使用 __all__ = ["xxx","xxx"]别人 使用 from xx import *的时候,只能用[]里的东西

写模块的时候,自己写的一些测试代码不想让别人导入的时候执行可以使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#写代码的格式
import xxx
class ClassName(object):
""" docstri
ng for ClassName"""
def __init__(self,arg):
super(ClassName,self).__init__()
self.arg = arg
def xxx():
sss
def main():
pass
if __name__ == "__main__"
main()

给程序传参:

1
2
import sys
sys.argv #接收传进来的参数,传进来的是一个列表[]

列表生成式:

1
2
3
4
a = [i for i in range(1,20)]  #生成1到19的列表
c = [i for i in range(1,20) if i%2==0]
d = [i for i in range(3) for j in range(3)]
e = [(i,j) for i in range(2) fro j in range(2)]

f = open(“文件名称”,”w/r/a”) # 打开文件

r 以只读方式打开文件。文件的指针将会在文件的开头。这是默认模式

w 打开一个文件只用于写入。如果文件存在则将其覆盖,如果不存在则创建。

a 打开一个文件用于追加。如果文件已存在,文件指针将会在文件的结尾。也就是说,新的内容会被写在末尾。

阅读全文 »

Web前段常见的开发语言

  • HTML就是一组标签和文本的组合,是一个最基本的网页。
  • CSS 渲染网页
  • JavaScript 把静态网页变成了动态网页,实现交互,是一种脚本语言
    阅读全文 »