python正則表達(dá)式對字符串的查找匹配
Python中的正則表達(dá)式要用到re模塊,下面先介紹一下正則表達(dá)式需要用到的特殊字符和說明
常用的RegEx基礎(chǔ)語法
| 語法 | 說明 |
| \d | 匹配一個數(shù)字字符 |
| \D | 匹配一個非數(shù)字字符 |
| \s | 匹配任何不可見字符(空格、制表符、換行符等) |
| \S | 匹配任何可見字符 |
| \w | 匹配任何單詞字符 |
| \W | 匹配任何非單詞字符 |
| . | 匹配所有字符 |
| ^ | 從字符串開頭開始匹配,比如^\d表示以一個數(shù)字字符開頭 |
| $ | 從字符串末尾開始匹配,比如\d$表示以一個數(shù)字字符結(jié)尾 |
| * | 匹配前一個字符任意次 |
| + | 匹配前一個字符一次或多次 |
| ? | 匹配前一個字符零次或一次 |
| {m} | 匹配前一個字符m次 |
| {m,n} | 匹配前一個字符最少m次最多n次 |
| \ | 轉(zhuǎn)義字符 |
| [] | 比如[a-z]表示匹配從a到z之間的所有字符串 |
| | | 或,比如A|B表示匹配A或B |
| () | 精確匹配括號中指定的模式 |
常用的RegEx函數(shù)
| 函數(shù) | 說明 |
|---|---|
| search | 從字符串中進(jìn)行搜索,成功則返回匹配目標(biāo),失敗則返回None |
| match | 從字符串開頭進(jìn)行匹配,成功則返回匹配目標(biāo),失敗則返回None |
| fullmatch | 匹配整個字符串 |
| split | 根據(jù)模式分割字符串 |
| findall | 查找字符串中所有非重疊匹配 |
| finditer | 類似于findall,但返回Python迭代器 |
| sub | 用提供的字符串替代匹配模式 |
以下為部分示例:
對于split函數(shù),我們在對字符串進(jìn)行分割的時候可以直接調(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'>#此處輸出的時一個match對象
>>> mp=re.search(pattern='\d+\W\d+',string=a)#查找電話號碼
>>> print(mp.group())#使用group方法獲取于指定模式相匹配的字符串
86-666666
>>> print(mp.start())#獲取第一個匹配字符串的索引
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傳入的字符串替代匹配到的第一個字符串
>>> print(m_sub)
xiaohong:wo jiao xiaoming,wo de dianhua shi +86-6666
#編譯模式
>>> p=re.compile('\d{6}')#預(yù)先設(shè)定好匹配的模式
>>> m1=p.search(a)#對預(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á)式
如果您需要匹配的文本模式很簡單,則正則表達(dá)式很好。但是匹配復(fù)雜的文本模式可能需要冗長,復(fù)雜的正則表達(dá)式。您可以通過告訴 re.compile() 函數(shù)來緩解這種情況忽略正則表達(dá)式字符串中的空格和注釋??梢酝ㄟ^將變量 re.VERBOSE 作為傳遞來啟用此“詳細(xì)模式” re.compile()的第二個參數(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)
請注意前一個示例如何使用三引號語法(’’’)創(chuàng)建一個多行字符串,以便您可以將正則表達(dá)式定義分布在多行上,使其更加清晰。正則表達(dá)式字符串中的注釋規(guī)則與常規(guī)Python代碼:#符號及其后的所有內(nèi)容線被忽略。此外,正則表達(dá)式的多行字符串內(nèi)的額外空格不被視為要匹配的文本模式的一部分。這使您可以組織正則表達(dá)式,以便更容易閱讀。
從粘貼板的文字中提取郵箱和手機(jī)號碼
#! /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á)式對字符串的查找匹配的文章就介紹到這了,更多相關(guān)python字符串查找匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python OpenCV圖像復(fù)原的實(shí)現(xiàn)步驟
Python OpenCV圖像復(fù)原是一個涉及去除噪聲、模糊等失真的過程,旨在恢復(fù)圖像的原始質(zhì)量,以下是一個詳細(xì)的案例教程,包括理論背景和具體實(shí)現(xiàn)步驟,需要的朋友可以參考下2024-12-12
Python如何使用Selenium WebDriver模擬用戶操作
這篇文章主要為大家詳細(xì)介紹了如何使用Selenium WebDriver來模擬用戶操作,以規(guī)避這些驗(yàn)證機(jī)制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-04-04
python3 設(shè)置多進(jìn)程名稱并在ps命令中可見(Centos7 系統(tǒng))
setproctitle 是一個 Python 模塊,用于設(shè)置進(jìn)程標(biāo)題(process title),通過設(shè)置進(jìn)程標(biāo)題,可以讓進(jìn)程在系統(tǒng)級的進(jìn)程管理工具中展示自定義的名稱,方便用戶查看和管理進(jìn)程,本文介紹python3 設(shè)置多進(jìn)程名稱并在ps命令中可見,感興趣的朋友一起看看吧2024-03-03
PyQt轉(zhuǎn)換路徑中的斜杠(斜杠(/)與反斜杠(\)轉(zhuǎn)換)
本文主要介紹了PyQt轉(zhuǎn)換路徑中的斜杠(斜杠(/)與反斜杠(\)轉(zhuǎn)換),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Python Selenium 設(shè)置元素等待的三種方式
這篇文章主要介紹了Python Selenium 設(shè)置元素等待的三種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Python利用matplotlib.pyplot.boxplot()繪制箱型圖實(shí)例代碼
相信大家應(yīng)該都知道Python繪制箱線圖主要用matplotlib庫里pyplot模塊里的boxplot()函數(shù),下面這篇文章主要給大家介紹了關(guān)于Python利用matplotlib.pyplot.boxplot()繪制箱型圖的相關(guān)資料,需要的朋友可以參考下2022-08-08

