Python學習第七天----- 正則表示式
阿新 • • 發佈:2020-12-05
什麼是正則表示式?
正則表示式是一個特殊的字元序列,用於檢測一個字串是否與我們所設定的這樣的字元序列相匹配。那麼,正則表示式的作用呢?
舉個例子:
1. 檢查一串資料是否是電話號碼。 2. 檢測一個字串是否符合email 3.把一個文字中指定的單詞替換成另一個單詞 ... ...內建函式:
在python中有一些內建函式可以實現一些字串匹配,例如index()可以用來判斷一些內容是否在序列中存在,當然也可以通過in來查詢。正則表示式正篇:
python提供了re模組,他就是python的正則表示式模組兒。在re模組兒中存放著正則所需要的函式和它的一些屬性。如findall, search等。、import判斷是否存在:re a = 'C|C++|Python|C#|Javascript|Java' result = re.findall('Python', a) print(result) # 結果是 # ['Python']
if len(result) != 0: print('字串中包含Python')查詢是否存在數字:
import re a = 'C0C++7Python8C#6Javascript9Java' result = re.findall('\d', a) print(result)結果是:
['0', '7', '8', '6', '9']
1. 元字元與普通字元:
字串指的普通字元,而元字元指的# . ^ $ * + ? {} [] \ | (),\d等等。2.字符集: []
中括號內的字元表示或的關係,即匹配任意其中一個。而^在其中,則表示範圍取反。
3.概括字符集:(常用)
字元 | 含義 | 備註 |
\d | 數字匹配 | |
\D | 匹配非數字 | |
\w | 匹配字母數字下劃線 | |
\W | 匹配非字母數字下劃線 | |
\s | 空白字元 | |
\S | 非空白字元 | |
. | 匹配除換行符\n以外的所有字元 | 如果設定了re.S,則表示匹配所有的字元,包括換行符 |
4.數量詞
import re a = 'python 11111java68php' r = re.findall('[a-z]{3}', a) print(r) #['pyt', 'hon', 'jav', 'php'] r1 = re.findall('[a-z]{3,6}', a) print(r1) #['python', 'java', 'php']注意,後一個表示式匹配的不是pyt和hon,而是python,即在數量詞上匹配儘可能大的數字個數。也就是貪婪匹配。 其他數量詞:
表示 | 含義 | 備註 |
* | 表示0次或無限多次 | |
+ | 1次或無限多次 | |
? | 匹配0次或者1次 | 作為數量詞,與非貪婪匹配的概念還是不一樣的 |
5.貪婪匹配和非貪婪匹配
匹配預設是貪婪匹配,用?來表示非貪婪匹配。
r2 = re.findall('[a-z]{3,6}?', a) print(r2) #['pyt', 'hon', 'jav', 'php']
6.邊界匹配
字元 | 含義 | 備註 |
^ | 必須以此作為匹配字串的開始 | 如‘^000’表示匹配以000作為開頭的字串 |
$ | 必須以此作為匹配字串的結束 |
7.組 ()
例子:import re a = 'PythonPython0PythonPythonPythonPython' r = re.findall('(Python){3}', a) print(r) #['Python']
8. re.findall的三個引數
第一個是正則str 第二個是被匹配的字串, 第三個引數:re.I 表示忽略大小寫,多個模式之間用 | 進行分隔,表示幾個模式同時使用。字元 | 含義 | 備註 |
re.I | 忽略大小寫 | |
re.S | 對於匹配字串種的.表示匹配所有的字元,包括\n | 可參考下面示例8-1或概括字符集 |
import re language = 'PythonC#JavaPHP' r = re.findall('c#.{1}', language, re.I | re.S) print(r) #['C#J']上邊正則表示式表示匹配c#,其後是任意字元,包括\n
9.re.sub正則替換
第四個引數flag=0表示預設的將所有的C#替換,flag = 1表示只替換匹配到的第一個字串
import re language = 'PythonC#JavaPHPC#JavaPHP' r = re.sub('C#', 'GO', language, 0) print(r) #PythonGOJavaPHPGOJavaPHP
內建函式replace 上邊程式碼改用replace的方法進行替換。
r = language.replace('C#', 'GO') print(r) #PythonGOJavaPHPGOJavaPHP
函式在re.sub中的使用:
import re language = 'PythonC#JavaPHPC#JavaPHP' def convert(value): pass #flag = 0表示預設的將所有的C#替換 r = re.sub('C#', convert, language, 1) print(r) #PythonJavaPHPC#JavaPHP當re.sub中第二個引數是一個函式的時候,如果匹配到'C#',則將匹配的結果傳到函式中作為引數,函式返回的結果去替換匹配到的內容。
import re language = 'PythonC#JavaPHPC#JavaPHP' def convert(value): print(value) #flag = 0表示預設的將所有的C#替換 r = re.sub('C#', convert, language)
列印的結果是:
說明返回的不只有匹配到的內容,還有span(匹配到的內容的位置)import re language = 'PythonC#JavaPHPC#JavaPHP' def convert(value): matched = value.group() print(matched) return '!!' + matched + '!!' #flag = 0表示預設的將所有的C#替換 r = re.sub('C#', convert, language) print(r)列印的結果:
C# C# Python!!C#!!JavaPHP!!C#!!JavaPHP
10.re.match和re.search
import re s = 'SD21F2S1F2SD1F1DSF5514' r = re.match('\d', s) print(r) r1 = re.search('\d', s) print(r1) #None #<re.Match object; span=(2, 3), match='2'>match將嘗試從字串的首位開始匹配,如果匹配不上,則返回None,一旦匹配到,就將匹配結果給返回.而search搜尋整個字串,一旦找到第一個匹配的字串,就馬上將匹配的結果返回。修改s
s = '21F2S1F2SD1F1DSF5514' r = re.match('\d', s)
返回的結果是:
<re.Match object; span=(0, 1), match='2'>列印匹配的結果:
print(r.group()) #2通過.span()可以獲取到匹配的位置
print(r.span()) #(0, 1)與re.findall對比:
r2 = re.findall('\d', s) print(r2) #['2', '1', '2', '1', '2', '1', '1', '5', '5', '1', '4']re.findall反回了所有的匹配的結果。
11.group分組
import re s = 'life is short, i use python' r = re.search('life(.*)python', s) print(r.group(0)) #group(0)永遠記錄的是完整的匹配結果 #life is short, i use python print(r.group(1)) #group(1)則是分組的第一組 # is short, i use用findall來看看
r = re.findall('life(.*)python', s) print(r) #[' is short, i use ']但是多分組呢?
s = 'life is short, i use python, i love python' r = re.findall('life(.*)python(.*)python', s) print(r) #[(' is short, i use ', ', i love ')]如果用search
import re s = 'life is short, i use python, i love python' r = re.search('life(.*)python(.*)python', s) print(r) print(r.group(0)) print(r.group(1)) print(r.group(2)) # <re.Match object; span=(0, 42), match='life is short, i use python, i love python'> # life is short, i use python, i love python # is short, i use # , i love當然我們可以使用groups()來檢視匹配結果。
print(r.groups()) #(' is short, i use ', ', i love ')此時會返回匹配到的括號中的字元
關於正則表示式的建議:
1.正則表示式可以幫助我們完成一些字串內建函式無法 完成的功能,提高工作效率 2.正則表示式不是python獨有的,且大部分主流語言都有正則表達水。(在我看來,除了關鍵字和部分細節,在語法和功能上都與javascript的正則相似)。由於python的應用場景(爬蟲,資料處理與分析等),使得正則顯得尤為重要 3.查詢常用正則表示式,如果這個表示式在你的系統上執行良好,不妨多花些時間去 研究一下。JSON
JSON是一種輕量級的資料交換格式 優點: 易於解讀,易於解析,網路傳輸效率高 JSON的反序列化: python內建了json模組兒。import json json_str = '{"name":"qiyue", "age":18}' student = json.loads(json_str) print(type(student)) print(student) print(student['name']) print(student['age']) # <class 'dict'> # {'name': 'qiyue', 'age': 18} # qiyue # 18如果JSON是一個陣列的話:
import json json_str = '[{"name": "qiyue", "age": 18},{"name": "dongsheng", "age": 22} ]' student = json.loads(json_str) print(type(student)) print(student)JSON序列化:
import json student = [ {'name': 'qiyue', 'age': 18, 'flag':False}, {'name': 'dasheng', 'age': 1500} ] json_str = json.dumps(student) print(type(json_str)) print(json_str) #<class 'str'> #[{"name": "qiyue", "age": 18, "flag": false}, {"name": "dasheng", "age": 1500}]