python正則表達(dá)式對(duì)字符串的查找匹配
Python中的正則表達(dá)式要用到re模塊,下面先介紹一下正則表達(dá)式需要用到的特殊字符和說(shuō)明
常用的RegEx基礎(chǔ)語(yǔ)法
| 語(yǔ)法 | 說(shuō)明 |
| \d | 匹配一個(gè)數(shù)字字符 |
| \D | 匹配一個(gè)非數(shù)字字符 |
| \s | 匹配任何不可見(jiàn)字符(空格、制表符、換行符等) |
| \S | 匹配任何可見(jiàn)字符 |
| \w | 匹配任何單詞字符 |
| \W | 匹配任何非單詞字符 |
| . | 匹配所有字符 |
| ^ | 從字符串開(kāi)頭開(kāi)始匹配,比如^\d表示以一個(gè)數(shù)字字符開(kāi)頭 |
| $ | 從字符串末尾開(kāi)始匹配,比如\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ù) | 說(shuō)明 |
|---|---|
| search | 從字符串中進(jìn)行搜索,成功則返回匹配目標(biāo),失敗則返回None |
| match | 從字符串開(kāi)頭進(jìn)行匹配,成功則返回匹配目標(biāo),失敗則返回None |
| fullmatch | 匹配整個(gè)字符串 |
| split | 根據(jù)模式分割字符串 |
| findall | 查找字符串中所有非重疊匹配 |
| finditer | 類(lèi)似于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)#查找電話(huà)號(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ū)分大小寫(xiě)匹配字符
#! /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á)式。您可以通過(guò)告訴 re.compile() 函數(shù)來(lái)緩解這種情況忽略正則表達(dá)式字符串中的空格和注釋??梢酝ㄟ^(guò)將變量 re.VERBOSE 作為傳遞來(lái)啟用此“詳細(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)語(yǔ)法(’’’)創(chuàng)建一個(gè)多行字符串,以便您可以將正則表達(dá)式定義分布在多行上,使其更加清晰。正則表達(dá)式字符串中的注釋規(guī)則與常規(guī)Python代碼:#符號(hào)及其后的所有內(nèi)容線(xiàn)被忽略。此外,正則表達(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-07
python中matplotlib條件背景顏色的實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于python中matplotlib條件背景顏色的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Python面向?qū)ο髮?shí)現(xiàn)數(shù)據(jù)分析的實(shí)例詳解
這篇文章主要通過(guò)幾個(gè)實(shí)例為大家詳細(xì)介紹了Python面向?qū)ο髮?shí)現(xiàn)數(shù)據(jù)分析的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2023-01-01
零基礎(chǔ)寫(xiě)python爬蟲(chóng)之抓取百度貼吧代碼分享
前面幾篇都是以介紹基礎(chǔ)知識(shí)為主,各位童鞋估計(jì)都在犯嘀咕了,你到底寫(xiě)不寫(xiě)爬蟲(chóng)????額,好吧,本文就給大家寫(xiě)一個(gè)簡(jiǎn)單的百度貼吧的python爬蟲(chóng)代碼。2014-11-11
Python性能調(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

