正則表達(dá)式

正則表達(dá)式的設(shè)計(jì)思想是用一種描述性的語言來給字符串定義一個(gè)規(guī)則,凡是符合規(guī)則的字符串,我們就認(rèn)為它“匹配”了,否則,該字符串就是不合法的。

  • \d可以匹配一個(gè)數(shù)字
  • \w可以匹配一個(gè)字母或數(shù)字
  • .可以匹配任意字符
  • *表示任意個(gè)字符(包括0個(gè))
  • +表示至少一個(gè)字符
  • ?表示0個(gè)或1個(gè)字符
  • {n}表示n個(gè)字符,用{n,m}表示n-m個(gè)字符
  • \s可以匹配一個(gè)空格
  • []表示范圍
  • A|B可以匹配A或B
  • ^表示行的開頭,$表示行的結(jié)束

re 模塊

Python提供re模塊,包含所有正則表達(dá)式的功能。

import re

test = '用戶輸入的字符串'
if re.match(r'正則表達(dá)式', test):
    print('ok')
else:
    print('failed')

切分字符串

用正則表達(dá)式切分字符串比用固定的字符更靈活,請(qǐng)看正常的切分代碼:

>>> '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']
>>> re.split(r'[\s\,\;]+', 'a,b;; c  d')
['a', 'b', 'c', 'd']

分組

除了簡單地判斷是否匹配之外,正則表達(dá)式還有提取子串的強(qiáng)大功能。用()表示的就是要提取的分組(Group)。

>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'
>>> m.groups()
('010', '12345')

貪婪匹配

正則匹配默認(rèn)是貪婪匹配,也就是匹配盡可能多的字符。

## 貪婪匹配
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')

## 非貪婪匹配,使用?可以讓貪婪匹配轉(zhuǎn)換為非貪婪匹配
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')

編譯

如果一個(gè)正則表達(dá)式要重復(fù)使用幾千次,出于效率的考慮,我們可以預(yù)編譯該正則表達(dá)式,接下來重復(fù)使用時(shí)就不需要編譯這個(gè)步驟了,直接匹配:

>>> import re
# 編譯:
>>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
# 使用:
>>> re_telephone.match('010-12345').groups()
('010', '12345')
>>> re_telephone.match('010-8086').groups()
('010', '8086')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容