1. 程式人生 > >day21:正則函式&模組和包(import)

day21:正則函式&模組和包(import)

正則函式

1.search  通過正則匹配出第一個物件返回,通過group取出物件中的值

# search   通過正則匹配出第一個物件返回,通過group取出物件中的值
strvar = "1+2 3*4"
obj = re.search("\d+(.*?)\d+",strvar)
print(obj)
# 返回匹配到的內容(匹配到一個就返回)
res = obj.group()
print(res) # <_sre.SRE_Match object; span=(0, 3), match='1+2'>
# 返回分組裡面的內容,型別是元組
tup = obj.groups()
print(tup[0]) # 1+2

2.match  驗證使用者輸入內容

# match    驗證使用者輸入內容(瞭解)
"""當search函式裡面的正則表示式前面加上^ 等價於 matth的用法"""
strvar = "a13566668888"
obj = re.search("^\d+",strvar)
print(obj)
# print(obj.group())
obj = re.match("\d+",strvar)
print(obj)
# print(obj.group())

3.split  切割

# split    切割
strvar = "alex|xboyww&wusir%ritian"
res = re.split("[|&%]",strvar)
print(res) # ['alex', 'xboyww', 'wusir', 'ritian']

strvar = "alex234234xboyww6786wusir78967896ritian"
res = re.split("\d+",strvar) # ['alex', 'xboyww', 'wusir', 'ritian']
print(res)

4.sub  替換

# sub      替換 
"""sub(正則,要替換的字元,原字串[,次數])"""
strvar = "alex|xboyww&wusir%ritian"
res = re.sub("[|&%]","-",strvar)
print(res) # alex-xboyww-wusir-ritian
strvar = "alex|xboyww&wusir%ritian"
res = re.sub("[|&%]","-",strvar,2)
print(res) # alex-xboyww-wusir-ritian

5.subn  替換

# subn     替換 (用法和sub一樣,區別在於返回的是元組 (結果,次數)  )
strvar = "alex|xboyww&wusir%ritian"
res = re.subn("[|&%]","-",strvar)
res = re.subn("[|&%]","-",strvar,1)
print(res)

6.finditer  返回字串中響應內容 返回迭代器

# finditer 匹配字串中相應內容,返回迭代器[迭代器中包含的是物件]
from collections import Iterator , Iterable
strvar = "jkasdfjkadfjk1234asfj2342kfa"
it = re.finditer("\d+",strvar)
print(isinstance(it,Iterator))

# 獲取迭代器裡面的內容
for i in it:
    print(i.group())

7.compile  指定一個統一的匹配規則

# compile  指定一個統一的匹配規則
"""
正常情況下,正則表示式編譯一次,執行一次.
如果想要編譯一次,多次使用的話,使用compile

compile 可以編譯一次,終身受益.節省系統的資源
"""
strvar = "jksdjdfsj72343789asdfaj234"
pattern = re.compile("\d+")
print(pattern)
lst = pattern.findall(strvar)
print(lst)
obj = pattern.search(strvar)
print(obj.group())

8.正則表示式修飾符

# ### 正則表示式修飾符
# re.I 使匹配對大小寫不敏感
strvar = "<h1>72347923489</H1>"
pattern = re.compile(r"<h1>(.*?)</h1>",flags=re.I)
obj = pattern.search(strvar)
print(obj)
print(obj.group())


# re.M 使每一行都能夠單獨匹配(多行),影響 ^ 和 $
strvar = """<h1>72347923489</H1>
<p>72347923489</p>
<li>72347923489</li>
"""
pattern = re.compile("^<.*?>(?:.*?)<.*?>$",flags=re.M)
lst = pattern.findall(strvar)
print(lst)


# re.S 使 . 匹配包括換行在內的所有字元
strar = """give
1234234234mefive
"""
pattern = re.compile("(.*?)mefive",flags=re.S)
obj = pattern.search(strar)
print(obj)
print(obj.group())

# 可以加多個修飾符 通過| 拼接
"""
pattern = re.compile("(.*?)mefive",flags=re.S|re.I|re.M)
"""

模組和包

模組部分

1.import匯入

# 匯入一次,終身受益,不會重複匯入
"""
import mymodule
import mymodule
import mymodule

""""""
# 模組.變數
print(mymodule.dog)
# 模組.函式
mymodule.xboyww()
# 模組.類
print(mymodule.MyClass().name)

2.匯入任意路徑下的模組

# ### 2.匯入任意路徑下的模組
"""自定義模組時,不能使用中文,也不能使用已存在的模組名,會被覆蓋."""
import sys
print(sys.path)
"""
# 把路徑新增到系統環境變數path當中,
# 執行命令時,系統會自動按照路徑找到模組,從而引入
# 如果找不到當前模組所在的路徑,直接報錯
"""


# 在windows中執行
sys.path.append(r"E:\python31_gx")
import mymodule2
print(mymodule2.ceshi100)

import mymodule2 as m2
print(m2.ceshi200)


"""
# [linux]
['/mnt/hgfs/python31_gx/day21/import_bao',
'/home/wangwen/PycharmProjects/untitled', 
'/usr/lib/python36.zip', 
'/usr/lib/python3.6', 
'/usr/lib/python3.6/lib-dynload', 
'/usr/local/lib/python3.6/dist-packages', 
'/usr/lib/python3/dist-packages'
]

# [windows]
['E:\\python31_gx\\day21\\import_bao', 
'E:\\py_mylianxi', 
'E:\\py_mylianxi\\venv\\Scripts\\python36.zip', 
'C:\\Users\\wangwen\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 
'C:\\Users\\wangwen\\AppData\\Local\\Programs\\Python\\Python36\\lib', 
'C:\\Users\\wangwen\\AppData\\Local\\Programs\\Python\\Python36', 
'E:\\py_mylianxi\\venv', 'E:\\py_mylianxi\\venv\\lib\\site-packages'
]
"""

3.from ... import ...

# ### 3.from ... import ... 從 ... 匯入 ... 
# 匯入單個
from mymodule import dog
print(dog)

# 匯入多個
from mymodule import cat,xboyww
print(cat)
xboyww()

# 匯入所有
""" * 代表所有 """
from mymodule import *
print(cat)
xgirl()

# 匯入的同時,起別名
from mymodule import xboyww as ww
ww()

 

*** 關於設定*號的匯入範圍:

# 可以設定*號的匯入範圍
from mymodule import *
print(cat)
# xboyww() error
'''可以在mymodule模組中設定__all__ = ["dog","cat"]來指定*號的匯入範圍'''

4.__name__ 魔術屬性的使用

返回模組名字的魔術屬性 __name__
如果當前檔案是直接執行的,返回__main__
如果當前檔案是間接匯入的,返回當前檔名(模組名)

檔案直接被執行的時候返回__main__
當成模組被匯入的時候,返回模組名本身

包的部分

關於包,需要注意的點:

1.檔案就是模組,資料夾就是包
2.__init__.py 對包(資料夾)進行初始化的指令碼檔案
匯入包的時候,系統自動呼叫__init__.py檔案,把init檔案裡面成員進行匯入
3.可以通過__init__間接匯入其他模組

1.import匯入包

# ### (一)import 匯入包的使用
# 1.獲取包初始化檔案中的成員
import package1
print(package1.ceshi301)

# 2.匯入包下的某些模組
# 方法一
import package1.mypath
package1.mypath.join()

# 方法二(模擬os.path.join寫法)
import package1
package1.mypath.join()
package1.mypath.getsize()
'''
注意:在方法二的情況下,需要在包內的__init__.py中寫入from package1 import mypath
相當於通過__init__檔案間接匯入了join和getsize方法
'''

2.from ... import 從包匯入相應成員

# 從包當中匯入成員屬性(__init__)
from package1 import ceshi301
print(ceshi301)
# 從包當中匯入模組
from package1 import mypath
mypath.join()
# 引入包下的模組下的具體成員
from package1.mypath import getsize
getsize()
# 在引入的同時,起別名
from package1.mypath import getsize as gs , join as j
gs()
j()

# 匯入所有,可以指定*號引入的範圍
from package1 import *
print(ceshi301)
# print(ceshi302) error

3.單入口模式(相對匯入)

# ### (三) 單入口模式(相對匯入)
import package2.pkg1.pgone_1 as ppp1
# print(ppp1.ceshi1000)

&n