一. 初識正則運算式
1.定義:是一個特殊的字符序列,可以幫助檢測一個字串是否與我們所設定的字符序列相匹配,
2.作用:可以實作快速檢索文本、實作替換文本的操作,
3.場景:
1、檢測一串數字是否是電話號碼
2、檢測一個字串是否符合e-mail格式
3、把一個文本里指定的單詞替換為另外一個單詞
4.例子:
查看傳入的字串是否還有Python
(1)
a = 'C|C++|Java|Python' print(a.index('Python') > -1) 或者
print('Python' in a)
(2)
用正則運算式處理:
import re a = 'C|C++|Java|Python' r = re.findall('Python',a) if len(r) > 0: print('字串中包含Python') else: print('No')
5.語法



二. 元字符與普通字符
1.‘Python’普通字符,'\d'元字符,正則運算式就是由一系列普通字符和元字符組成的,
2.例子:
提取字串中所有的數字:\d :表示所有數字
import re a = 'C2C++4Java7Python6' r = re.findall('\d',a) print(r) #結果: ['2', '4', '7', '6']
提取字串中所有的非數字:
import re a = 'C2C++4Java7Python6' r = re.findall('\D',a) #\D為非數字 print(r)
三.字符集
例子:
1.中間一個字符是c或者f的單詞:[ ]:字符集,或關系
普通字符定界,確定某一個小段,該例子中a[cf]c,中括號外面的a和c就是普通字符定界
import re s = 'abc,acc,adc,aec,afc,ahc' r = re.findall('a[cf]c',s) print(r) #結果: ['acc', 'afc']
2.中間一個字符不是c或者f的單詞:^:取反操作
import re s = 'abc,acc,adc,aec,afc,ahc' r = re.findall('a[^cf]c',s) print(r) #結果: ['abc', 'adc', 'aec', 'ahc']
3.利用字符順序省略字符,匹配c,d,e,f:- :省略中間字符
import re s = 'abc,acc,adc,aec,afc,ahc' r = re.findall('a[c-f]c',s) print(r) #結果: ['acc','adc','aec','afc']
四. 概括字符集
1.\d可以用[0-9]表示:
import re a = 'python1111java678php' r = re.findall('[0-9]',a) print(r)
2.\w匹配所有的數字和字符:
\w只能匹配單詞字符,也就是[A-Za-z0-9_]
\W只匹配非單詞字符,如空格、&、\n、\r、\t等都為非單詞字符
import re a = 'python1111&java___678php' r = re.findall('\w',a) print(r
結果:

3.\s代表空白字符:空格、\n、\r等
\S代表非空白字符
mport re a = 'python1111&_java678 \nph\rp' r = re.findall('\s',a) print(r) #[' ', ' ', '\n', '\r']
常用的概括字符集:\d \D \w \W \s \S
. 匹配除換行符\n之外的其他所有字符
五.數量詞
1.匹配三個字母的單詞:
import re a = 'python1111 java678php' r = re.findall('[a-z]{3}',a) print(r) #['pyt', 'hon', 'jav', 'php']
2.匹配完整的單詞:
import re a = 'python1111 java678php' r = re.findall('[a-z]{3,6}',a) print(r) #['python', 'java', 'php']
利用數量詞{數量}多次重復
六. 貪婪與非貪婪
數量詞有貪婪和非貪婪之分,一般來說Python傾向于貪婪的匹配方式,
1.{數量} ?變成非貪婪模式
2.例子:
import re a = 'python1111 java678php' r = re.findall('[a-z]{3,6}?',a) print(r) #['pyt', 'hon', 'jav', 'php']
七. 匹配0次1次或者無限多次
1.用 * 對它前面的字符匹配0次或者無限多次:
import re a = 'pytho0python1pythonn2' r = re.findall('python*',a) print(r) #['pytho', 'python', 'pythonn']
2.用+匹配一次或者無限多次:
import re a = 'pytho0python1pythonn2' r = re.findall('python+',a) print(r) #['python', 'pythonn']
3.用?匹配0次或者一次:
import re a = 'pytho0python1pythonn2' r = re.findall('python?',a) print(r) #['pytho', 'python', 'python']
注意:多出來的n會被去掉,因為讀到python時就滿足了
用?來進行去重復的操作,
貪婪與非貪婪中的{3,6}?和 python? 時的問號用法不一樣,
八. 邊界匹配
例子:
QQ號的位數是否符合4-8位:
import re qq = '10000004531' r = re.findall('^\d{4,8}$',qq) print(r) #[]
^ $ 組成邊界匹配符
^ 從字串開頭開始匹配
$ 從字串末尾開始匹配
000$ 最后三位是000
^000 開始三位是000
九. 組
1.例子:
python字串是否重復出現三次:
import re a = 'pythonpythonpythonpythonpython' r = re.findall('(python){3}',a) print(r)
2.
一個括號對應一組,
[]里的字符是或關系
()里的字符是且關系
十. 匹配模式引數
1.例子:
忽略大小寫:
import re a = 'pythonC#\nJavaPHP' r = re.findall('c#.{1}',a,re.I|re.S) print(r) #['c#\n']
2.
re.I:忽略大小寫,多個模式之間用|,這里的|是且的關系
re.S:匹配包括\n在內的任意字符
十一. re.sub正則替換

0:把所有匹配的都替換,1:只有第一個匹配到的被替換
1.例子:
(1)查找并替換:
import re a = 'PythonC#JavaPHP' r = re.sub('C#','GO',a) print(r) #PythonGOJavaPHP
import re a = 'PythonC#\nJavaPHP' r = re.sub('C#','GO',a,0) #0:把所有的C#換成GO,1:只有第一個匹配到的被替換成GO print(r) #PythonGO #JavaPHP
(2)常規替換可以使用replace函式:
import re a = 'PythonC#\nJavaPHP' a = a.replace('C#','GO') #是sub的簡化版 print(a)
(3)sub強大的地方在于其第二個引數可以是一個函式:


import re def convert(value): matched = value.group() #從物件中提取字串 return '!!' + matched + '!!' a = 'PythonC#JavaPHP' r = re.sub('C#',convert,a) print(r) #Python!!C#!!JavaPHP
sub匹配到第一個結果會傳到convert函式中去,回傳的結果是新的字串用來替換匹配到的詞,
十二.把函式作為引數傳遞
例子:
找出數字,大于等于6的替換成9,小于6的替換成0:
import re def convert(value): matched = value.group() if int(matched) >= 6: return '9' else: return '0' s = 'A8C3721D86' r = re.sub('\d',convert,s) print(r) #A9C0900D99
十三.search與match函式
1.
match:從字串開始的地方開始匹配(首字母開始匹配),
search:搜索整個字串,直到找到第一個滿足的結果并回傳,
match和search回傳的是物件,且只匹配一次,不會像findall一樣匹配所有,
2
import re s = 'A8C3721D86' r = re.match('\d',s) print(r) r1 = re.search('\d',s) print(r1) #None #<re.Match object; span=(1, 2), match='8'>
3.

小結:
r.span()回傳位置,(第一個數字表示找到的該數字的前一個位置,第二個數字表示找到的該數字的位置)
r.group()回傳字串
十四. group分組
1.提取life和python之間的字符:
import re s = 'life is short,i use python' r = re.search('life(.*)python',s) print(r.group(1)) #is short,i use
group(0)是完整匹配結果
group(1)是完整匹配結果的內部分組
(2)
用findall做:
import re s = 'life is short,i use python' r = re.findall('life(.*)python',s) print(r) #['is short,i use']
2.group(1)是第一個分組,group(2)是第二個分組:
import re s = 'life is short,i use python,i love python' r = re.search('life(.*)python(.*)python',s) print(r.group(0)) print(r.group(1)) print(r.group(2)) #life is short,i use python,i love python #is short,i use #,i love
3.r.groups()回傳除完整以外的結果:
import re s = 'life is short,i use python,i love python' r = re.search('life(.*)python(.*)python',s) print(r.groups()) #(' is short,i use ', ',i love ')
總結:
一些關于學習正則的建議
python絕大多數用在爬蟲上,需要用到正則運算式
搜索 '常用正則運算式' 并加以分析
一. 理解JSON
1.JavaScript Object Notation, 是一種輕量級(與XML比)的資料交換格式,
2.字串是JSON的表現形式,符合JSON格式的字串就是JSON字串,
3.優勢:
- 易于閱讀
- 易于決議
- 網路傳輸效率高
適合做跨語言交換資料
4.

二. 反序列化:字串到語言的資料結構的程序
json內用雙引號,則外部用單引號表示字串
1.利用python內部的json決議JSON資料:
import json json_str = '{"name":"tai","age":23}' #json內用雙引號,則外部用單引號表示str student = json.loads(json_str) print(type(student)) print(student) print(student['name']) print(student['age']) #<class 'dict'> #決議出來是字典 #{'name': 'tai', 'age': 23} #tai #23
同樣的JSON字串,不同的語言會裝換成不同的型別,其中對應到Python中是字典型別,
2.決議JSON陣列:
import json json_str = '[{"name":"tai","age":23,"flag":false},{"name":"tai","age":23}]' student=json.loads(json_str) print(type(student)) print(student) #<class 'list'> #陣列轉成了串列 #[{'name': 'tai', 'age': 23, 'flag': False}, {'name': 'tai', 'age': 23}] #串列中兩個元素,每個元素是一個字典
字串->語言下某一資料結構的程序:反序列化
總結:json到Python對應的資料轉換型別

三.序列化
1. 序列化:字典到字串
import json student = [ {"name":"tai","age":23,"flag":False}, {"name":"tai","age":23} ] json_str = json.dumps(student) print(type(json_str)) print(json_str) #<class 'str'> #[{"name": "tai", "age": 23, "flag": false}, {"name": "tai", "age": 23}]
四.小談JSON、JSON物件與JSON字串
JSON某種程度上是與Javascript平級的語言,
JSON物件、JSON、JSON字串,
A語言資料型別 —JSON(中間資料型別)—> B語言資料型別
JSON有自己的資料型別,雖然和Javascript的資料型別差不多,
REST服務的標準格式,使用JSON,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/198241.html
標籤:Python
上一篇:Tensorflow機器學習入門——AttributeError: module 'scipy.misc' has no attribute 'toimage'
下一篇:python操作word
