正則表達式總結-1

轉載

正則表達式是一種強大的文本處理工具,它允許你根據一定的規則來搜索、匹配、替換和驗證文本,適配各種編程語言。

應用場景

正則表達式在計算機領域有廣泛的應用,包括:

1、文本搜索和匹配:查找特定模式的字符串,如搜索包含特定關鍵詞的文檔。

2、數據驗證:驗證用戶輸入的數據是否符合特定格式,如電子郵件地址、電話號碼、日期等。

3、數據提取:從文本中提取特定信息,如從HTML頁面中提取鏈接或從日誌文件中提取關鍵信息。

4、字符串替換:將文本中的特定模式替換爲其他內容,如過濾敏感詞彙。

5、日誌分析:分析日誌文件以提取有用的信息,如統計訪問量或檢測異常事件。

6、編譯原理:在編譯器和解釋器中用於詞法分析和語法分析。

7、網絡爬蟲:用於網頁內容的抓取和處理。

元字符

常見元字符:

.:匹配任意字符,除了換行符。
例如,正則表達式 a.b 可以匹配 "axb"、"aab"、"a1b" 等。

*:匹配【前一個字符】零次或多次。
例如,正則表達式 ca*t 可以匹配 "ct"、"cat"、"caat" 等。

+:匹配【前一個字符】一次或多次。
例如,正則表達式 ca+t 可以匹配 "cat"、"caat" 等,但不匹配 "ct"。

?:匹配【前一個字符】零次或一次。
例如,正則表達式 colou?r 可以匹配 "color" 和 "colour"。

|:表示“或”操作,匹配兩個或多個模式中的任何一個。
例如,正則表達式 apple|banana 可以匹配 "apple" 或 "banana"。

[]:定義字符類,匹配括號內的任何字符。
例如,正則表達式 [aeiou] 可以匹配任何元音字母。

():表示分組,用於捕獲匹配的文本。
例如,正則表達式 (\d{3})-(\d{2}) 可以匹配 "123-45" 並捕獲 "123" 和 "45"。

字符類

字符類用於匹配某一類字符,常見字符類:

[0-9]:匹配任何數字。
[a-z]:匹配小寫字母。
[A-Z]:匹配大寫字母。
[a-zA-Z]:匹配任何字母。
[^0-9]:匹配除了數字以外的字符。
[aeiou]:匹配任何元音字母。

數量詞

數量詞用於指定模式中字符的重複次數,常見數量詞:

{n}:匹配【前一個字符】恰好 n 次。
{n,}:匹配【前一個字符】至少 n 次。
{n,m}:匹配【前一個字符】至少 n 次,但不超過 m 次。
*:匹配零次或多次。
+:匹配一次或多次。
?:匹配零次或一次。

邊界匹配

邊界匹配用於限定匹配模式的位置,常見的邊界匹配符號:

^:匹配字符串的開始
$:匹配字符串的結束
\b:匹配單詞的邊界
\B:匹配非單詞邊界

組匹配

正則表達式的組匹配允許你將模式中的一部分用括號括起來,以便捕獲匹配的內容,這些捕獲的內容可以在後續操作中使用。組匹配非常有用,特別是在需要提取或替換特定部分的文本時。

示例一:匹配日期

考慮一個匹配日期的例子,正則表達式爲

 (\d{4})-(\d{2})-(\d{2})

這個正則表達式會匹配形如 "2023-05-09" 的日期,並捕獲年、月、日三個部分。

"2023-05-09" 匹配整個模式,捕獲的結果是:年 = "2023",月 = "05",日 = "09"。

示例二:替換重複單詞

正則表達式的組匹配在替換文本中的內容時非常有用。考慮一個需要將文本中的重複單詞替換爲一次的情況,正則表達式爲

\b(\w+)\b\s+\1\b
  • \b(\w+)\b 匹配一個單詞,並捕獲到組1中。
  • \s+ 匹配一個或多個空白字符。
  • \1\b 匹配與組1相同的單詞,並匹配單詞邊界。

通過這個正則表達式,可以將文本中的 "word word" 替換爲 "word"。

反向引用

正則表達式的反向引用是一種強大的技術,允許你在模式中引用已經捕獲的文本,並在匹配時使用這些引用。這通常通過組匹配和反向引用組號來實現。反向引用在處理需要重複出現的文本模式時非常有用,例如識別重複單詞、標籤、括號等。

基本語法

在正則表達式中,反向引用使用組號來指示要引用的組,組號從1開始。組是通過在模式中使用圓括號 () 來創建的。一旦你捕獲了一個組,你可以在後續的模式中引用它。引用的語法是 \ 後跟組號,例如 \1 表示引用組1。

示例一:匹配重複單詞

假設我們有一段文本,其中有一些單詞出現了兩次。我們希望使用正則表達式將這些重複的單詞識別出來。

文本:"Hello, hello, world, world, example, example."

正則表達式:

 \b(\w+)\b.*\b\1\b
  • \b(\w+)\b:匹配一個單詞並捕獲到組1中。
  • .*:匹配任意字符(包括空格)零次或多次。
  • \b\1\b:引用組1,確保匹配的是與組1相同的單詞,並且單詞邊界匹配。

使用這個正則表達式,我們可以捕獲到重複的單詞 "example" 和 "world"。

示例二:HTML標籤匹配

假設我們需要從HTML文檔中提取所有的鏈接文本和鏈接地址。HTML標籤是有嵌套關係的,我們可以使用反向引用來處理這種情況。

HTML片段:

<a href="https://www.example1.com">Example 1</a><a href="https://www.example2.com">Example 2</a><a href="https://www.example3.com">Example 3</a>

正則表達式:

<a href="([^"]+)">([^<]+)</a>
  • <a href="([^"]+)">:匹配鏈接的開頭標籤,捕獲鏈接地址到組1中。
  • ([^<]+):匹配鏈接文本,捕獲到組2中。
  • :匹配鏈接的結束標籤。
import re

str = '<a href="https://www.example1.com">Example 1</a>' \
      '<a href="https://www.example2.com">Example 2</a>' \
      '<a href="https://www.example3.com">Example 3</a>'

pattent = '<a href="([^"]+)">([^<]+)</a>'

data = re.findall(string=str,pattern=pattent)
print(data)

# 輸出
[('https://www.example1.com', 'Example 1'), ('https://www.example2.com', 'Example 2'), ('https://www.example3.com', 'Example 3')]

實戰

案例1

轉載:Python-正則表達式(給同事培訓篇)

  • 問題

對於字符串values,想要提取其中的cap所在的行信息,並輸出打印出結果。

import re

values = """
[13:52:44]<fruits>
[13:52:44]apple  : 11111 mv
[13:52:44]banana : 22222 mv
[13:52:44]vol    : 10327 mv
[13:52:44]<batterry>
[13:52:44]vol    : 10327 mv
[13:52:44]cur    : 4344 ma
[13:52:44]cap    : 25 %
[13:52:44]tpwr   : 44.86 w
[13:52:44]<motor>
[13:52:44]bird   : 999999 w 
[13:52:44]monkey : 888888
[13:52:44]tpwr   : 44.86 w
[13:52:44]<animals>
  """
  • 先定位並提取數據
data = re.findall("<batterry>(.*)<motor>", values, re.S) # re.S表示換行也算
print(data)
# 輸出
['\n[13:52:44]vol    : 10327 mv\n[13:52:44]cur    : 4344 ma\n[13:52:44]cap    : 25 %\n[13:52:44]tpwr   : 44.86 w\n[13:52:44]']
  • 定義匹配策略
    • "\s" 匹配空白字符
    • "\d" 匹配數字字符
    • "." 匹配任意字符
    • "*" 匹配0個或多個字符
    • "" 轉義,匹配特殊字符
    • "()" 將所需要的數據單獨匹配出來
for key in data:
    volValue = re.findall("\[(.*)\]({})\s*:\s*(\d*)".format("cap"), key)
    print(volValue)
# 輸出
[('13:52:44', 'cap', '25')]
  • 輸出
volDict = {}
timeList = []
valueList = []

for value in volValue:
    timeList.append(value[0])
    valueList.append(value[2])

volDict["time"] = timeList
volDict["vol"] = volValue[0][1]
volDict["value"] = valueList
print(volDict)
# 輸出
{'time': ['13:52:44'], 'vol': 'cap', 'value': ['25']}

案例2

轉載:Python-正則表達式(給同事培訓篇2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章