Python3(七) 正則表達式與JSON

一. 初識正則表達式 

1.定義:是一個特殊的字符序列,能夠幫助檢測一個字符串是否與咱們所設定的字符序列相匹配。php

2.做用:能夠實現快速檢索文本、實現替換文本的操做。java

3.場景:python

           一、檢測一串數字是不是電話號碼正則表達式

            二、檢測一個字符串是否符合e-mail格式json

            三、把一個文本里指定的單詞替換爲另一個單詞c#

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。

相關文章
相關標籤/搜索