Python正則表達式:高效匹配文本

在我們平時的工作和學習中,常常需要對字元串進行處理。而正則表達式則是一種強大的字元串匹配工具,可以用於字元串的查找、替換、截取等操作。

一、正則表達式基礎

正則表達式是由一系列字元和特殊字元組成的模式,用於描述字元串的特徵。常用的正則表達式元字元有:

  • .:匹配除換行符以外的任意字元
  • \d:匹配數字字元,也可以用[0-9]表示
  • \w:匹配字母、數字和下劃線,也可以用[a-zA-Z0-9_]表示
  • \s:匹配空白字元,包括空格、製表符、換行符等
  • []:用於指定匹配的字符集合,比如[aeiou]匹配母音字母
  • ^:匹配開頭,比如^hello匹配以hello開頭的字元串
  • $:匹配結尾,比如world$匹配以world結尾的字元串
  • *:匹配任意次,包括0次
  • +:匹配至少一次
  • ?:匹配0次或1次
  • {m,n}:匹配m至n次,包括m和n

下面是一個簡單的示例,利用正則表達式匹配出一個字元串中的數字:

import re
str = 'There are 3 apples and 5 oranges.'
pattern = r'\d+'
result = re.findall(pattern, str)
print(result)  # ['3', '5']

以上代碼使用\d+這個正則表達式模式來查找字元串中的數字,並返回一個列表。如果使用re.search()函數,則會返回第一個匹配的結果。

二、正則表達式高級應用

正則表達式不僅可以用來進行基本的匹配,還可以進行分組、反向引用、零寬斷言等高級操作。

1. 分組

分組可以將正則表達式中的一部分提取出來,方便後續對其進行操作。分組使用圓括弧()進行表示。比如匹配一段文本中的中英文名字:

import re
text = 'My name is Jack, 你叫什麼名字?'
pattern = r'My name is (\w+), (.+)\?'
match = re.search(pattern, text)
if match:
print('My name is', match.group(1))
print('What is your name?', match.group(2))

以上代碼中,(\w+)表示將英文名字進行分組,(.+)表示將中文名字進行分組,然後使用match.group()方法獲取分組結果。

2. 反向引用

反向引用可以在正則表達式中引用前面的分組結果。它使用\數字(?P<name>)進行表示,其中\<數字>表示引用數字代表的分組結果,(?P<name>)則可以為分組指定一個名字。

比如,使用正則表達式尋找重複的單詞:

import re
text = 'I like coding, coding is fun. What do you like?'
pattern = r'\b(\w+)\b\s+\1\b'
matches = re.findall(pattern, text)
print(matches)  # ['coding']

以上代碼中,(\w+)將一個單詞進行分組,\s+匹配任意長度的空格,\1則表示引用前面的分組結果。它的含義是,匹配重複的單詞,即兩個相同的單詞之間有任意長度的空格。

3. 零寬斷言

零寬斷言是指在匹配字元串的時候,只匹配符合某種條件的字元串,而不將該條件字元串包含其中。常用的零寬斷言有:正向先行斷言(?=pattern)、正向後行斷言(?<=pattern)、負向先行斷言(?!pattern)和負向後行斷言(?<!pattern)

比如,判斷一個字元串是否包含數字和字母:

import re
text = 'abc123'
pattern1 = r'(?=.*\d)(?=.*[a-zA-Z])'
pattern2 = r'[a-zA-Z0-9]{6,}'
match1 = re.search(pattern1, text)
match2 = re.search(pattern2, text)
if match1 and match2:  
print('The text contains letters and numbers.')

以上代碼中,(?=.*\d)(?=.*[a-zA-Z])分別表示要求字元串中包含數字和字母,[a-zA-Z0-9]{6,}則表示要求字元串中至少有6個字母和數字。

三、應用實例

正則表達式可以應用於很多場景,比如爬蟲、文本處理、數據清洗等。下面是一些常見的應用實例。

1. 爬蟲

在爬蟲中,我們需要從網頁中提取有用的信息,又需要快速、準確地將無用信息濾掉。正則表達式可以幫助我們完成這個任務。

import re
import requests
url = 'https://www.baidu.com'
html = requests.get(url).text
pattern = r''
result = re.findall(pattern, html)
for link in result:
print(link)

以上代碼中,<a href="(https?:\/\/.*?)".*?>表示匹配所有標籤中的URL。這樣我們就可以從網頁中提取出所有的鏈接。

2. 文本處理

正則表達式在文本處理中的應用也是非常廣泛的。比如,在處理日誌文件時,我們需要將其中的IP地址進行提取,正則表達式可以輕鬆實現。

import re
log = '127.0.0.1 - - [01/May/2022:08:34:12 +0800] "GET / HTTP/1.1" 200 1234'
pattern = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
result = re.search(pattern, log)
if result:
print(result.group())

以上代碼中,\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}可以匹配IP地址。正則表達式可以解決很多文本處理問題,大大提高了工作效率。

3. 數據清洗

在數據清洗中,正則表達式也扮演著重要的角色。比如,在清洗電話號碼數據時,我們可以使用正則表達式將格式不正確的號碼過濾掉或者進行格式轉換。

import re
phone = '0086-13812345678'
pattern1 = r'^\d{1,4}-\d{7,8}$'
pattern2 = r'^0086-(\d{11})$'
if re.match(pattern1, phone):
print('The phone number is in the correct format.')
match = re.match(pattern2, phone)
if match:
print('The corrected phone number is +86-', match.group(1))

以上代碼中,^\d{1,4}-\d{7,8}$表示匹配以區號開頭,後接7位或8位號碼的電話號碼格式。而^0086-(\d{11})$則表示將0086開頭的電話號碼轉換成+86-XXXXXXXXXXX的格式。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/248692.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:29
下一篇 2024-12-12 13:29

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論