Python基礎(chǔ)(15)——正則表達(dá)式

re.match()

re.match(正則表達(dá)式,要匹配的字符串),匹配出以字符串的起始位置開(kāi)始匹配正則表達(dá)式,如果匹配,返回匹配對(duì)象(Match Object),否則返回None(注意不是空字符串"")。

import re
print(re.match('hello','hello world'))
print(re.match('world','hello world'))
# <_sre.SRE_Match object; span=(0, 5), match='hello'>
#None

單字符匹配

字符 說(shuō)明
[] 匹配中括號(hào)里任意一個(gè)字符
[^] 除了中括號(hào)里的字符意外
\s 任意空格
\S 非空格
\d 匹配數(shù)字0-9
\D 匹配非數(shù)字,表示除了數(shù)字之外的字符
\w 任意字符[A-Za-z0-9]
\W 匹配非單詞字符

點(diǎn)號(hào)匹配

import re

result = re.match("A.C", "ABC")
print(result.group())
result = re.match("A.C", "A1C")
print(result.group())

中括號(hào)匹配

import re

result = re.match("A[B1D]C", "ABC")
print(result.group())
result = re.match("A[BCD]C", "AGC")
if result:
    print(result.group())

豎線匹配

text = "123test"
regexStr = "(123|txt)"
matchOjc = re.match(regexStr,text)
if matchOjc:
   print(matchOjc.group(1))

開(kāi)頭結(jié)尾匹配

字符 說(shuō)明
^ 以箭頭后面的字符開(kāi)頭
$ 以美元符號(hào)前面的字符結(jié)尾
text = "test123"
regexStr = "^t.*3$"
if re.match(regexStr,text):
   print("match")

多個(gè)字符匹配

字符 說(shuō)明
* 匹配前一個(gè)字符出現(xiàn)0次或者無(wú)限次,即可有可無(wú)
+ 匹配前面的字符出現(xiàn)出現(xiàn)1次或者無(wú)限次,即至少有1次
? 匹配前一個(gè)字符出現(xiàn)1次或者0次,即要么有1次,要么沒(méi)有,同時(shí)使貪婪變成非貪婪模式
{m} 匹配前一個(gè)字符出現(xiàn)m次
{m,n} 匹配前一個(gè)字符出現(xiàn)從m到n次
import re

regStr = '[A-Za-z_]+[\w]*'
result = re.match(regStr, "test_1")
if result:
    print(result.group())
result = re.match(regStr, "1_test")
if result:
    print(result.group())

匹配分組

字符 功能
| 匹配左右任意一個(gè)表達(dá)式
(ab) 將括號(hào)中字符作為一個(gè)分組
\num 引用第num分組匹配到的字符串
(?P<name>) 分組起別名
(?P=name) 引用別名為name分組匹配到的字符串
import re

regStr = '[\w]{4,20}@(163|qq|gmail)\.com'
result = re.match(regStr, "test@qq.com")
if result:
    print(result.group())

'r'是防止字符轉(zhuǎn)義的 如果路徑中出現(xiàn)'\t'的話 不加r的話\t就會(huì)被轉(zhuǎn)義 而加了'r'之后'\t'就能保留原有的樣子。

import re

regStr = r'<(\w*)><(\w*)>.*</\2></\1>'
result = re.match(regStr, "<html><head>test</head></html>")
if result:
    print(result.group())
result = re.match(regStr, "<html><head>test</body></html>")
if result:
    print(result.group())

分組別名

import re

regStr = r'<(?P<label1>\w*)><(?P<label2>\w*)>.*</(?P=label2)></(?P=label1)>'
result = re.match(regStr, "<html><head>test</head></html>")
if result:
    print(result.group())
result = re.match(regStr, "<html><head>test</body></html>")
if result:
    print(result.group())

匹配子表達(dá)式

使用小括號(hào)()將想要提取的內(nèi)容括起來(lái)。

import re
content = 'hello 12345 python'
result = re.match('^h\w{4}\s(\d+)\s\w+',content)
print(result.group())
print(result.group(1))
print(result.span())

貪婪匹配

點(diǎn)(.)可以匹配任意字符(除去換行符)星號(hào)()代表匹配前面字符的無(wú)限次。點(diǎn)星(.)組合可以匹配任意字符,但是點(diǎn)星(.)會(huì)匹配盡可能多的字符,被認(rèn)為是貪婪匹配.貪婪匹配表達(dá)式^h.(\d+)\s\w+造成group(1)只會(huì)得到數(shù)字7,因?yàn)辄c(diǎn)星(.*)會(huì)盡可能的取匹配字符,就把1234也吞噬了,只留下數(shù)字5了

import re
content = 'hello 12345 python'
result = re.match('^h.*(\d+)\s\w+',content)
print(result.group())
print(result.group(1))
print(result.span())
# hello 12345 python
# 5
# (0, 18)

非貪婪匹配

非貪婪匹配的模式在點(diǎn)星后面加一個(gè)問(wèn)號(hào)?即點(diǎn)星問(wèn)(.*?)是非貪婪匹配,盡可能的少匹配字符

import re
content = 'hello 12345 python'
result = re.match('^h.*?(\d+)\s\w+',content)
print(result.group())
print(result.group(1))
print(result.span())

匹配修飾符

修飾符 說(shuō)明
re.I 對(duì)大小寫(xiě)不敏感
re. L 做本地化識(shí)別匹配
re. M 多行匹配,影響^和$
re. S 匹配包括換行在內(nèi)的所有字符
import re
content = '''hello 12345
python'''
result = re.match('^h.*?(\d+).*?n$',content,re.S)
print(result.group())
print(result.group(1))
print(result.span())

Search

匹配整個(gè)字符串,直到找到一個(gè)匹配的對(duì)象,匹配結(jié)束沒(méi)有找到匹配對(duì)象才放回None

import re

result = re.search('\d+', "查找數(shù)字:1245")
if result:
    print(result.group())

findall

匹配所有符合規(guī)律的內(nèi)容,返回包含結(jié)果的列表

import re

rList = re.findall('\d+', "查找數(shù)字:1245注冊(cè)時(shí)11112中1")
for r in rList:
    print(r)
#1245
#11112
#1

sub

re.sub(pattern, repl, string, count=0, flags=0)
使用repl替換string中每一個(gè)匹配的子串后返回替換后的字符串。
當(dāng)repl是一個(gè)字符串時(shí),可以使用\id或\g<id>、\g<name>引用分組,但不能使用編號(hào)0。
當(dāng)repl是一個(gè)方法時(shí),這個(gè)方法應(yīng)當(dāng)只接受一個(gè)參數(shù)(Match對(duì)象),并返回一個(gè)字符串用于替換(返回的字符串中不能再引用分組)。
count用于指定最多替換次數(shù),不指定時(shí)全部替換。

import re
content = 'hello12345python'
result = re.sub('\d',"",content)
print(result)
#hellopython
import re


def func(matchObj):
    if matchObj:
        return "python"

print(re.sub(r"\d+", func, 'hello 123'))

split

根據(jù)匹配進(jìn)行切割字符串,并返回一個(gè)列表

import re

rList = re.split(r':| ', "查找數(shù)字:1245注冊(cè)時(shí) 11112中1")
for r in rList:
    print(r)
最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • python的re模塊--細(xì)說(shuō)正則表達(dá)式 可能是東半球最詳細(xì)最全面的re教程,翻譯自官方文檔,因?yàn)楣俜轿臋n寫(xiě)的是真...
    立而人閱讀 23,451評(píng)論 4 46
  • re模塊手冊(cè) 本模塊提供了和Perl里的正則表達(dá)式類似的功能,不關(guān)是正則表達(dá)式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,211評(píng)論 0 13
  • #首先,python中的正則表達(dá)式大致分為以下幾部分: 元字符 模式 函數(shù) re 內(nèi)置對(duì)象用法 分組用法 環(huán)視用法...
    mapuboy閱讀 1,727評(píng)論 0 51
  • 2017年底,手頭一家公司納稅超過(guò)了5萬(wàn),可以有資格參加北京的小汽車搖號(hào)了。 恰好計(jì)劃著再買一輛新能源汽車作為市內(nèi)...
    文介閱讀 378評(píng)論 0 2
  • 文/叫我布爺兒 我今天心情很不好。一直跟我一起活動(dòng)的一個(gè)姑娘在下午下課了抓住了我的胳膊,一直詢問(wèn)了我怎么了,我一直...
    秋玖閱讀 304評(píng)論 2 1

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