python正則表達(dá)式對(duì)字符串的查找匹配
Python中的正則表達(dá)式要用到re模塊,下面先介紹一下正則表達(dá)式需要用到的特殊字符和說明
常用的RegEx基礎(chǔ)語法
語法 | 說明 |
\d | 匹配一個(gè)數(shù)字字符 |
\D | 匹配一個(gè)非數(shù)字字符 |
\s | 匹配任何不可見字符(空格、制表符、換行符等) |
\S | 匹配任何可見字符 |
\w | 匹配任何單詞字符 |
\W | 匹配任何非單詞字符 |
. | 匹配所有字符 |
^ | 從字符串開頭開始匹配,比如^\d表示以一個(gè)數(shù)字字符開頭 |
$ | 從字符串末尾開始匹配,比如\d$表示以一個(gè)數(shù)字字符結(jié)尾 |
* | 匹配前一個(gè)字符任意次 |
+ | 匹配前一個(gè)字符一次或多次 |
? | 匹配前一個(gè)字符零次或一次 |
{m} | 匹配前一個(gè)字符m次 |
{m,n} | 匹配前一個(gè)字符最少m次最多n次 |
\ | 轉(zhuǎn)義字符 |
[] | 比如[a-z]表示匹配從a到z之間的所有字符串 |
| | 或,比如A|B表示匹配A或B |
() | 精確匹配括號(hào)中指定的模式 |
常用的RegEx函數(shù)
函數(shù) | 說明 |
---|---|
search | 從字符串中進(jìn)行搜索,成功則返回匹配目標(biāo),失敗則返回None |
match | 從字符串開頭進(jìn)行匹配,成功則返回匹配目標(biāo),失敗則返回None |
fullmatch | 匹配整個(gè)字符串 |
split | 根據(jù)模式分割字符串 |
findall | 查找字符串中所有非重疊匹配 |
finditer | 類似于findall,但返回Python迭代器 |
sub | 用提供的字符串替代匹配模式 |
以下為部分示例:
對(duì)于split函數(shù),我們?cè)趯?duì)字符串進(jìn)行分割的時(shí)候可以直接調(diào)用split方法,再次不再進(jìn)行
>>> import re#導(dǎo)入包 >>> a='xiaoming:wo jiao xiaoming,wo de dianhua shi +86-666666' >>> print(re.search(pattern='\d+\W\d+',string=a)) <re.Match object; span=(45, 54), match='86-666666'>#此處輸出的時(shí)一個(gè)match對(duì)象 >>> mp=re.search(pattern='\d+\W\d+',string=a)#查找電話號(hào)碼 >>> print(mp.group())#使用group方法獲取于指定模式相匹配的字符串 86-666666 >>> print(mp.start())#獲取第一個(gè)匹配字符串的索引 45 >>> print(mp.end())#獲取匹配字符串的 54 >>> print(mp.span())#獲取索引范圍 (45, 54) >>> print(re.findall(pattern='\w+',string=a)) ['xiaoming', 'wo', 'jiao', 'xiaoming', 'wo', 'de', 'dianhua', 'shi', '86', '666666'] >>> m_sub=re.sub(pattern='\w+:',string=a,repl='xiaohong:')#模式替代,使用repl傳入的字符串替代匹配到的第一個(gè)字符串 >>> print(m_sub) xiaohong:wo jiao xiaoming,wo de dianhua shi +86-6666 #編譯模式 >>> p=re.compile('\d{6}')#預(yù)先設(shè)定好匹配的模式 >>> m1=p.search(a)#對(duì)預(yù)先設(shè)定好的模式調(diào)用查找 >>> print(m1.group())獲取查找到的字符串 666666
不區(qū)分大小寫匹配字符
#! /usr/bin/python3 import re rebocop = re.compile(r'rebocop', re.I) match = rebocop.search('ReboCop is part man, part machine, all cop.').group() print(match)
管理復(fù)雜的正則表達(dá)式
如果您需要匹配的文本模式很簡(jiǎn)單,則正則表達(dá)式很好。但是匹配復(fù)雜的文本模式可能需要冗長(zhǎng),復(fù)雜的正則表達(dá)式。您可以通過告訴 re.compile() 函數(shù)來緩解這種情況忽略正則表達(dá)式字符串中的空格和注釋??梢酝ㄟ^將變量 re.VERBOSE 作為傳遞來啟用此“詳細(xì)模式” re.compile()的第二個(gè)參數(shù)。
#! /usr/bin/python3 import re phoneRegex = re.compile(r'''( (\d{3}|\(\d{3}\))? # area code (\s|-|\.)? # separator \d{3} # first 3 digits (\s|-|\.) # separator \d{4} # last 4 digits (\s*(ext|x|ext.)\s*\d{2,5})? #extension )''', re.VERBOSE)
請(qǐng)注意前一個(gè)示例如何使用三引號(hào)語法(’’’)創(chuàng)建一個(gè)多行字符串,以便您可以將正則表達(dá)式定義分布在多行上,使其更加清晰。正則表達(dá)式字符串中的注釋規(guī)則與常規(guī)Python代碼:#符號(hào)及其后的所有內(nèi)容線被忽略。此外,正則表達(dá)式的多行字符串內(nèi)的額外空格不被視為要匹配的文本模式的一部分。這使您可以組織正則表達(dá)式,以便更容易閱讀。
從粘貼板的文字中提取郵箱和手機(jī)號(hào)碼
#! /usr/bin/python3 # phoneAndEmail.py - Finds phone numbers and email address on the chipboard. import pyperclip, re americaPhoneRegex = re.compile(r'''( (\d{3}|\(\d{3}\))? # area code (\s|-|\.)? # separator (\d{3}) # first 3 digits (\s|-|\.) # separator (\d{4}) # last 4 digits (\s*(ext|x|ext.)\s*(\d{2,5}))? # extension )''', re.VERBOSE) chinesePhoneRegex = re.compile(r'1\d{10}') emailPhoneRegex = re.compile(r'''( [a-zA-Z0-9._%+-]+ # username @ # @ symbol [a-zA-Z0-9.-]+ # domain name (\.[a-zA-Z]{2,4}) # dot-something )''', re.VERBOSE) # Find matches in clipboard text. text = str(pyperclip.paste()) matches = [] for groups in americaPhoneRegex.findall(text): phoneNum = '-'.join([groups[1], groups[3], groups[5]]) if groups[8] != '': phoneNum += ' x' + groups[8] matches.append(phoneNum) for groups in emailPhoneRegex.findall(text): matches.append(groups[0]) for groups in chinesePhoneRegex.findall(text): matches.append(groups[0]) # copy results the clipboard. if len(matches) > 0: pyperclip.copy('\n'.join(matches)) print('Copied to clipboard:') print('\n'.join(matches)) else: print('No phone numbers or email addresses found.')
總結(jié)
到此這篇關(guān)于python正則表達(dá)式對(duì)字符串的查找匹配的文章就介紹到這了,更多相關(guān)python字符串查找匹配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)選取或刪除指定列包含指定內(nèi)容的行
這篇文章主要介紹了python實(shí)現(xiàn)選取或刪除指定列包含指定內(nèi)容的行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02關(guān)于python?DataFrame的合并方法總結(jié)
這篇文章主要介紹了關(guān)于python?DataFrame的合并方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07python中matplotlib條件背景顏色的實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于python中matplotlib條件背景顏色的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Python面向?qū)ο髮?shí)現(xiàn)數(shù)據(jù)分析的實(shí)例詳解
這篇文章主要通過幾個(gè)實(shí)例為大家詳細(xì)介紹了Python面向?qū)ο髮?shí)現(xiàn)數(shù)據(jù)分析的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2023-01-01Python性能調(diào)優(yōu)的十個(gè)小技巧總結(jié)
大家好,今天這篇文章關(guān)于Python性能調(diào)優(yōu)的10個(gè)小技巧,每天花5-10分鐘閱讀我的文章,對(duì)你技術(shù)提升一定會(huì)有幫助。喜歡記得收藏以防迷路2021-11-11基于python3+OpenCV實(shí)現(xiàn)人臉和眼睛識(shí)別
這篇文章主要為大家詳細(xì)介紹了基于python3+OpenCV實(shí)現(xiàn)人臉和眼睛識(shí)別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09