Python3學習(四)

   我們在做項目中,經常會遇到檢驗手機號,郵箱一類的數據格式是否符合要求,
如果使用循環一個一個字符判斷就太麻煩了。
   那麼,有沒有一種簡單有效的方法用於檢測數據格式的合理性呢?

7. 正則表達式

在介紹正則表達式前,先介紹一個Python內置函數,可以簡單的判斷某段字符是否存在於一個較長字符串內。

(1)index()函數

a = 'C|C++|Java|C#|Python|Perl'
print(a.index('Python'))

--------------------
14

index函數返回字符串匹配位置,即首字符所在字符串的位置,返回值大於-1則說明匹配成功。
還有一個"in"的用法
print(‘Python’ in a) # 輸出結果:True

(2)re模塊

在Python中提供了re模塊來進行正則表達式匹配。

import re

a = 'C|C++|Java|C#|Python|Perl'
r = re.findall('Python', a)
print(r)
===========================
['Python']

findall函數第一個參數是要匹配的模式,第二個是源字符串。第三個參數是選擇匹配模式。
findall函數簡介
此例中,我們的pattern爲具體字符串,這與用index函數沒什麼區別,正則表達式的用法精髓在於它能匹配一類字符而不是某個具體字符串。
例如:\d代表數字,\D代表非數字
(一般大寫和小寫表示的意義正好相反)

(3)常用的正則表達式字符集

這裏列舉一些常用的,詳細的正則表達式介紹及元字符等可以查看:
正則表達式簡介
正則表達式元字符

字符 描述
* 匹配前面的子表達式零次或多次。
+ 匹配前面的子表達式一次或多次。
? 匹配前面的子表達式零次或一次。
() 標記一個子表達式的開始和結束位置。
[abc] 字符集合。匹配所包含的任意一個字符。
{n} n 是一個非負整數。匹配確定的 n 次。
{n,m} m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。
\d 匹配一個數字字符。等價於 [0-9]。
\D 匹配一個非數字字符。等價於 [^0-9]。
\s 匹配任何空白字符,包括空格、製表符、換頁符等等。
\S 匹配任何非空白字符。
\w 匹配字母、數字、下劃線。等價於’[A-Za-z0-9_]’。
\W 匹配非字母、數字、下劃線。等價於 ‘[^A-Za-z0-9_]’。
\ 轉義字符,匹配上述特殊字符時使用

注:
① [a-z]{3, 5}
Python匹配時是貪婪的,所以檢測出3位後繼續檢測,若要設置非貪婪,則需在後面加上?。[a-z]{3, 5}?
② 記住正則表達式匹配是按組匹配,而組是用小括號()括起來的,例如:(Python){10}將匹配10個Python,而Python{10}將匹配Pythonnnnnnnnnn
③ "^"表示從字符串開始處進行匹配,“$”表示從字符串末尾開始匹配。

import re
r = re.findall('^\d{3, 8}$', a)

說明是完全匹配3~8位的數字,若是9位數則不會匹配前8位。

(4)re中幾個內置函數

  1. re.findall(pattern, string, flags=0)

第三個參數flag默認值爲0,此時flag沒有什麼作用;若設置爲re.I,則說明匹配時不區分大小寫;若設置爲re.S,則使得“.”生效(“.”用於匹配匹配除換行符之外的任何單個字符)設置多種模式請用“|”分隔。

  1. re.sub(pattern, repl, string, count=0, flags=0)
    我個人認爲這個函數很強大,原因是他的第二個參數可以傳入一個函數。
    官方對sub函數的解釋是:Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl. If the pattern isn’t found, string is returned unchanged. repl can be a string or a function; if it is a string, any backslash escapes in it are processed. If repl is a function, it is called for every non-overlapping occurrence of pattern. The function takes a single match object argument, and returns the replacement string.

sub函數用於正則替換,第一個參數是正則表達式,第二個是要替換成什麼,第三個是原字符串常量,第四個count等於0時無休止替換下去,等於1表示只替換第一個,第五個參數flags和findall的flags是一樣的。
re.sub()的第三個參數還可以爲函數,函數參數爲正則表達式,返回結果用於替換原字符。傳入的參數爲對象,需要用group得到對象值。

import re

st = 'sdsd06df67ee2'

def convert(value):
	match = value.group()
	if int(match) <= 5:
		return 'a'
	else:
		return 'A'

ret = re.sub('\d', convert, st)
print(ret)

=========================
sdsdaAdfAAeea
  1. re.match(pattern, string, flags=0)
  2. re.search(pattern, string, flags=0)

match函數從字符串首字符開始匹配,而search查找字符串則只要按順序找到一個就可以了。例如A0009,re.match(’\d’, s)是匹配不出來的,而re.search(’\D’, s)就可以匹配出來。

兩個函數返回的是對象(假設是R)。
R.group()返回某組的值,R.span()返回的是對象的位置信息。

(5)group組

正則表達式中用括號表示一個組,而每個組都有編號,group可以傳入這個編號,例如:

r = re.search('(life.*python)', s) # 由於這裏只有一組,括號可以省略
print(r.group(0)) # 由於只有一組,所以0可以省略

group還可以傳多個參數,將以元組形式返回。另外,r.groups()返回完整的匹配結果,且只返回括號中匹配的。

s = 'life is short, I use python'
r = re.search('life(.*)python(.*)python', s)
print(r.groups())

===========================
(' is short, I use ', ', I love ')

下面給大家推薦一個很全的常用正則表達式合集:
看我!點這裏!!

8. JSON(JavaScript Object Notation)

這裏介紹一種重要的數據格式——JSON。它是一種輕量級的數據交換格式,字符串是JSON的表現形式。可實現跨語言交換數據。它有三個特點:易於閱讀、易於解析、網絡傳輸效率高。

json應用場景1:瀏覽器發送請求獲取json數據,在前端實現邏輯運算,呈現出我們所看到的效果。
json應用場景2:一個網站app不同的API服務是用不同語言寫的,於是可以用json來進行跨語言數據傳輸。
json格式要用 雙引號 將字符串引起來。

import json
json_str = '{"name":"Tom", "age":20}'
json.loads(json_str)  # 轉換成字典等Python數據格式

=========================
{'name': 'Tom', 'age': 20}

上述過程稱爲反序列化。

序列化:與上述過程相反。
附json和Python數據結構的轉換:

JSON Python
object dict
array list
string str
number int
number float
true True
false False
null None

序列化:將Python數據格式轉換成JSON格式
json.dumps(student) #用於轉換成json格式
序列化後的數據可存儲在MongoDB(一種NoSQL)中。

關於JSON的幾個名詞

JSON:是一種數據交換格式,它已經成爲ECMAScript(由W3C,萬維網聯盟制定)的一個子集了,而ECMAScript的子集還包括我們熟知的JavaScript、微軟最近開發的TypeScript等。

JSON對象:一般只在JavaScript中有這個說法。

JSON字符串:也是在JavaScript中的概念,符合JSON格式的字符串就是JSON字符串。

========================
下節我們將介紹Python的高級語法。

發佈了10 篇原創文章 · 獲贊 11 · 訪問量 2842
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章