1. 程式人生 > 其它 >python之正則表示式的使用

python之正則表示式的使用

一、re模組的使用

python中使用正則表示式,需要用到re模組來進行操作,Re庫常用的功能函式

1、re.match函式

引數說明:接收兩個引數,

  • 第一個是匹配的規則,
  • 第二個是匹配的目標字串,

re.match嘗試從字串的起始位置匹配一個模式,匹配成功 返回的是一個匹配物件(這個物件包含了我們匹配的資訊),如果不是起始位置匹配成功的話,match()返回的就是空

import re
s = '12356python123456'
print(re.match(r'123',s))
print(re.match(r'1236',s))
print(re.match(r'1234',s))
print(re.match(r'python',s))


列印結果:
<_sre.SRE_Match object; span=(0, 3), match='123'>
None
None
None

  

2、re.search方法

引數說明:接收兩個引數,

  • 第一個是匹配的規則,
  • 第二個是匹配的目標字串,

re.search 掃描整個字串並返回第一個成功的匹配.【匹配多個符合要求的字元,只返回第一個滿足條件的】

import re
s = '12356python123456'
print(re.search(r'123',s))
print(re.search(r'1236',s))
print(re.search(r'1234',s))
print(re.search(r'python',s))


列印結果:
<_sre.SRE_Match object; span=(0, 3), match='123'>
None
<_sre.SRE_Match object; span=(11, 15), match='1234'>
<_sre.SRE_Match object; span=(5, 11), match='python'>

Process finished with exit code 0

  

re.match與re.search的區別

re.match從字串的開始位置進行匹配,如果字串開始不符合正則表示式,則匹配失敗,函式返回空;
而re.search匹配整個字串,直到找到一個匹配成功的則進行返回,如果整個字串中都沒有找到匹配成功的,則返回空

  

3、findall方法

引數說明:接收兩個引數,

  • 第一個是匹配的規則,
  • 第二個是匹配的目標字串,

在字串中找到正則表示式所匹配的所有子串並返回一個列表,如果沒有找到匹配的,則返回空列表。

import re

s = '12356python123456'
print(re.findall(r'123', s))  # ['123', '123']
print(re.findall(r'1236', s))  # []
print(re.findall(r'1234', s))  # ['1234']
print(re.findall(r'python', s))  # ['python']

  

 注意: match 和 search 是匹配一個結果, findall 匹配處所有符合規則的結果。

 

4、sub方法

替換字串中的某些字元,可以用正則表示式來匹配被選子串。

re.sub(pattern,repl,string,count=0)

引數:
  • pattern:匹配的規則;
  • repl:匹配之後替換的新內容;
  • string:需要按規則替換的字串;
  • count:替換的次數,可以不傳參,預設替換所有符合規則的。
import re

s = '12356python123456python'
print(re.sub(r'python','PYTHON', s))  # 12356PYTHON123456PYTHON
print(re.sub(r'python','PYTHON', s,1))  # 12356PYTHON123456python
print(re.sub(r'python','PYTHON', s,2))  # 12356PYTHON123456PYTHON

  5、貪婪模式說明:

貪婪模式:Python裡數量詞預設是貪婪的,總是嘗試匹配儘可能多的字元;
import re

s = '12356python123456python'
# {m,n}表示n>m,匹配的位數
print(re.search(r'\d{3,}', s))  # <_sre.SRE_Match object; span=(0, 5), match='12356'>
print(re.search(r'\d{3,3}', s))  # <_sre.SRE_Match object; span=(0, 3), match='123'>
print(re.search(r'\d{3,4}', s))  # <_sre.SRE_Match object; span=(0, 4), match='1235'>
print(re.search(r'\d{3,5}', s))  # <_sre.SRE_Match object; span=(0, 5), match='12356'>
print(re.search(r'\d{3,6}', s))  # <_sre.SRE_Match object; span=(0, 5), match='12356'>
# 非貪婪模式:總是嘗試匹配儘可能少的字元,在"*","?","+","{m,n}",{m,}後面加上?,可以關閉貪婪模式
# 關閉貪婪模式之後,儘可能獲取更少的,如下,只獲取到最前面的3個數值(規則時至少3個,非貪婪就是匹配最前面符合規則的3個數組)
print(re.search(r'\d{2,4}?', s))  # <_sre.SRE_Match object; span=(0, 2), match='12'>
print(re.search(r'\d{3,4}?', s))  # <_sre.SRE_Match object; span=(0, 3), match='123'>

  

二、正則表示式語法

1、表示單字元

單字元:即表示一個單獨的字元,比如匹配數字用\d ,匹配非數字使用\D,具體規則如下:

字元

功能

.

匹配任意1個字元(\n除外)

[7a ]

匹配[ ]中列舉的字元,這裡就是匹配7或者a這兩個字元其中的一個

\d

匹配數字,即0-9

\D

匹配非數字,即不是數字

\s

匹配空白,即 空格,tab鍵

\S

匹配非空白

\w

匹配單詞字元,即a-z、A-Z、0-9、_

\W

匹配非單詞字元

例項如下:

# {m,n}表示n>m,匹配的位數
# .:匹配任意1個字元(\n除外)
print(re.search(r'.', s))  # <_sre.SRE_Match object; span=(0, 1), match='1'>
#[7a]匹配[ ]中列舉的字元,這裡就是匹配7或者a這兩個字元其中的一個
print(re.search(r'[3a]', s))  # <_sre.SRE_Match object; span=(2, 3), match='3'>
print(re.search(r'[3p]', s))  # <_sre.SRE_Match object; span=(2, 3), match='3'>
print(re.search(r'[p3]', s))  # <_sre.SRE_Match object; span=(2, 3), match='3'>
print(re.search(r'[p4]', s))  # <_sre.SRE_Match object; span=(5, 6), match='p'>

  

import re

s = '12356python123456python#'

# \d匹配數字,即0-9
print(re.search(r'\d', s))  # <_sre.SRE_Match object; span=(0, 1), match='1'>
print(re.search(r'\d{3,}', s))  # <_sre.SRE_Match object; span=(0, 5), match='12356'>
# \D匹配非數字,即不是數字
print(re.search(r'\D', s))  # <_sre.SRE_Match object; span=(5, 6), match='p'>
print(re.search(r'\D{3,}', s))  # <_sre.SRE_Match object; span=(5, 11), match='python'>

# \w匹配單詞字元,即a-z、A-Z、0-9、
print(re.search(r'\w', s))  # <_sre.SRE_Match object; span=(0, 1), match='1'>
# \W匹配非單詞字元,即a-z、A-Z、0-9、
print(re.search(r'\W', s))  # <_sre.SRE_Match object; span=(23, 24), match='#'>

  

2、表示數量

如果要匹配某個字元多次,就可以在字元後面加上數量進行表示,具體規則如下:

字元

功能

*

匹配前一個字元出現0次或者無限次,即可有可無

+

匹配前一個字元出現1次或者無限次,即至少有1次

?

匹配前一個字元出現1次或者0次,即要麼有1次,要麼沒有

{m}

匹配前一個字元出現m次

{m,}

匹配前一個字元至少出現m次

{m,n}

匹配前一個字元出現從m到n次

import re

s = '12356python123456python#'
# *匹配前一個字元出現0次或者無限次,即可有可無
print(re.findall(r'1*',s))  # ['1', '', '', '', '', '', '', '', '', '', '', '1', '', '', '', '', '', '', '', '', '', '', '', '', '']
print(re.findall(r'T*',s))  # ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
# +匹配前一個字元出現1次或者無限次,即至少有1次
print(re.findall(r'1+', s))  # ['1', '1']
print(re.findall(r'T+', s))  # []
# ?匹配前一個字元出現1次或者0次,即要麼有1次,要麼沒有
print(re.findall(r'1?',s))  # ['1', '', '', '', '', '', '', '', '', '', '', '1', '', '', '', '', '', '', '', '', '', '', '', '', '']
print(re.findall(r'T+?', s))  # []
# {m}匹配前一個字元出現m次
print(re.findall(r'1{1}', s))  # ['1', '1']
# {m,}匹配前一個字元至少出現m次
print(re.findall(r'1{2,}', s))  # []
# {m,n}匹配前一個字元出現從m到n次
print(re.findall(r'4{1,4}', s))  # ['1', '1']