個人推薦廖雪峰老師的課程,本來這一部分看不太懂,看了他**上的,感覺明了很多。
正規表示式
正規表示式是一種用來匹配字串,如判斷字串是否是乙個合法的郵箱位址時,如果對內容進行乙個個判斷的話,
會很麻煩,而正規表示式可以用一種描述性的語言來給字串定義乙個規則,對於符合規則的字串就匹配成功。
例判斷乙個字串是否是合法的email的方法是:
1:建立乙個匹配email的正規表示式
2:用改正規表示式去匹配使用者的輸入來判斷是否合法
正規表示式中,如果直接給出字元,就是精確匹配。用\d可以匹配數字,\w可以匹配乙個字母或數字,所以:
例:'00\d','\d\d\d''\w\w\d'
.可以匹配任意字元,'py.'可以匹配'pyc','py1','py!'等等
要匹配變長的字元,在正規表示式中,用*表示任意個字元,用+表示至少乙個字元,用?表示0個或1個字元,用表示n個字元
用表示n-m個字元 例:
\d\s+\d
其中\s可以匹配乙個字元,而\s+表示至少有乙個空格
所以,該正規表示式可以匹配以任意空格隔開的帶區號的**號碼
若要匹配012-345678,因為-是特殊字元,所以要用\轉義
\d\-\d
為了更精確的匹配,用表示範圍,比如:
[0-9a-za-z\_]表示匹配乙個數字、字母或下劃線
[0-9a-za-z\_]+可以匹配至少由乙個數字、字母或者下劃線組成的字串
[a-za-z\_][0-9a-za-z\_]*表示可以匹配字母或下劃線開頭,
後接任意個由數字、字母或者下劃線組成的字串
[a-za-z\_][0-9a-za-z\_]更精確的限制了變數的長度是1-20個字元
(開頭的乙個字母或下劃線,後面最多19個字元數字、字母或者下劃線)
a|b可以匹配a或b,所以(p|p)ython可以匹配'python'或'python'
^表示行的開頭,^\d表示必須以數字開頭
$表示行的結束,\d$表示必須以數字結束
re模組
在python中提供re模組,包含正規表示式的所有功能。注意,python的字串本身也用\轉義
s = 'abc\\-001'
對應的正規表示式字串是'abc\-001'
所以為了避免因為轉義引起的錯誤,建議使用r為字首,即
s = r'abc\-001'正規表示式字串不變
主要的是有match()方法和search()方法,但是兩者有一點差別,match函式只能夠字串的開始位置開始匹配,而search是可以匹配字串的任意位置,但也是返回找到的第乙個匹配的模式。在search中應用^表示式,可以和match一樣效果。
先看看如何判斷正規表示式是否匹配:
import re
s = "my number is 123"
match = re.search(r'\d', s)
print(match)
print(match.group())
<_sre.sre_match object; span=(13, 16), match='123'>match()方法是判斷是否匹配,如果匹配成功,返回乙個match物件,否則返回none。常見的格式:123
test = '使用者輸入的字串'
if re.match(r'正規表示式', test):
print('ok')
else:
print('failed')
import re
s = "my email is [email protected]"
match = re.search(r'[\w.-]+@[\w.-]+', s)
if match:
print(match.group())
else:
print("match not found")
[email protected]還可以進一步從匹配字串中提取符合條件的特定部分,用(),即分組。
import re
2s = "my email is [email protected]"
3match = re.search('([\w.-]+)@([\w.-]+)', s)4
5if match:
6 print(match.group()) # 完整郵箱位址
7 print(match.group(1)) # 姓名kaiser
8 print(match.group(2)) # 網域名稱jizhi.im
kaiser
jizhi.im
切分字串
用正規表示式切分字串比用固定的字元更靈活,
>>>
'a b c'.split(' ')
['a', 'b', '', '', 'c']
無法識別兩個連續的空格,而使用正規表示式,則沒有這個問題,
>>> re.split(r'\s+', 'a b c')
['a', 'b', 'c']
可以同時切分不同的字串
>>> re.split(r'[\s\,]+', 'a,b, c d')#,符號需要使用轉義\
['a', 'b', 'c', 'd']
如果使用者輸入了一組標籤,可以使用正規表示式來把不規範的輸入轉化成正確的陣列。 捕獲
前面的match和search只能返回第乙個匹配模式的字串,如果我們要找到所有匹配的結果,
就需要用到findall()
findall
(pattern, string, flags[optional])
如果匹配成功,findall()會返回乙個列表,包含所有匹配的字串,否則返回的是空列表。
importre
s = "tim's phone numbers are 12345-41521 and 78963-85214"
match = re.findall(r'\d', s)
ifmatch:
print(match)
['12345', '41521', '78963', '85214']
對於findall()也可以使用捕獲組,返回的是由元組(tuple)構成的列表(list)
importre
s = "tim's phone numbers are 12345-41521 and 78963-85214"
match = re.findall(r'(\d)-(\d)', s)
print(match)
foriinmatch:
print()
print(i)
print("first group", i[0])
print("second group", i[1])
[('12345', '41521'), ('78963', '85214')]('12345', '41521')
first group 12345
second group 41521
('78963', '85214')
first group 78963
second group 85214
深度學習所需的python 學習筆記2
數值 python支援三種數值型別 1 int 2 float 3 complex 如複數8 17j 可使用type 函式檢視返回的變數型別 數值計算 python中常見的數值計算有表中 符號含義 例子結果 加法 42 143 減法42 0.5 41.5 乘法 1234 2 2468 浮點除法 1 ...
深度學習所需的python 學習筆記5
字典 字典也是一種集合,但是其中的元素分為鍵和值,類似於函式的對映,這樣的資料結構成為 關聯陣列 字典的格式 建立空字典 dict1 heros 字典heros中含有兩個元素,鍵和值,其中字串和數值可以作為鍵,鍵也是不可更改的資料型別,所以,列表和字典都不行,原則上,鍵是不可重複的,後者會覆蓋前者,...
深度學習python
squeeze 降維 維度為1的降掉 tf.squeeze arr,降維,將維度為1 的降掉 arr tf.variable tf.truncated normal 3,4,1,6,1 stddev 0.1 arr2 tf.squeeze arr,2,4 arr3 tf.squeeze arr 降掉...