打個廣告歡迎加入linux,python資源分享群群號:478616847

目錄:

1、什么是正則表達式,python中得正則簡介

2、re模塊的內容

正則表達式 java、3、小練習

一、什么是正則表達式(re)

正則表達式相信很多人都熟悉了,在python中正則表達式的支持是通過re(regular expression)模塊,正則表達式是可以匹配文本片段的模式,簡單的是正則表達式就是普通的字符串,可以處理字符串。也就是說正則表達式的存在就是來處理文本字符串的

下面來熟悉下正則中的幾個概念:

1、通配符

python正則化。? 通配符是一種特殊語句可以使用它來代替一個或多個真正的字符比如‘ . ’點,他就可以代替任意的字符除了換行符,.python就可以等于xpython、+python等等

2、字符集

既然通配符”.? ”可以表示一個任意的字符,那么字符集就可以表示一個字符的范圍例如[a-z]就可以表示a-z的任意一個字符,還可以[a-zA-Z0-9]來表示大小寫字母和數字,我們還可以將它來轉義[^a]就是除了a的意思

注意的是這里的轉意符不是單個\而是雙\\

為什么使用兩個反斜線?

這是為了通過解釋器進行轉義,需要進行兩個級別的轉義:1.通過解釋器的轉義;2.通過 re 模塊轉義。如果不想使用兩個反斜線,可以考慮使用原始字符串,如:r'python\.org'。

3、選擇符

為什么存在選擇符呢?主要原因是假如我們想匹配兩個字符串如“aaa”,“bbb”,我們就需要使用管道符(|)因此在匹配的時候就可以寫成‘aaa|bbb’,當有的時候不需要匹配這兩的時候假如只需要匹配字符串“aaa”或者“bbb”就可以寫成“p(aaa|bbb)”

4、表示個數(重復模式)

表示個數顧名思義就是來表示這個字符有多少個的意思主要模式(pattern)有:

(pattern)*:表示這個模式可以重復0次或者多次

(pattern)+:表示允許這個模式出現一次或者多次

(pattern){m,n}:表示允許這個模式重復m到n次

(pattern){n}:表示重復n次

(pattern){n,} :表示重復n或者更多次,最低重復n次

5、表示開頭和結尾

當我們要匹配以什么什么開頭或者以什么什么結尾是表示開頭我們可以使用‘^a’表示以a開頭,’$a‘表示以a結尾

二、re模塊的內容

既然我們知道re是個模塊那么他肯定有很多功能函數來供我們使用下面我們來看一看

?? 1 compile(pattern[, flags])???????????????? 根據包含正則表達式的字符串創建模式對象

??? 2 search(pattern, string[, flags])??????? 在字符串中尋找模式

??? 3 match(pattern, string[, flags])???????? 在字符串的開始處匹配模式

??? 4 split(pattern, string[, maxsplit=0])?? 根據模式的匹配項來分割字符串

??? 5 findall(pattern, string)???????????????????? 列出字符串中模式的所有匹配項

??? 6 sub(pat, repl, string[, count=0])????? 將字符串中所有pat的匹配項用repl替換

??? 7 escape(string)?????????????????????????????? 將字符串中所有特殊正則表達式字符轉義

??? 這個compile我們最后來講

首先我們來看看函數的語法:

 re.match(pattern, string, flags=0)

?? pattern:匹配的正則表達式

?? string:要匹配的字符串。

?? flags:標志位,用于控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

匹配模式:

使用方法re.IGNORECASE,或者re.I

?

 1 I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case
 2 使匹配對大小寫不敏感;字符類和字符串匹配字母時忽略大小寫。舉個例子,[A-Z]也可以匹配小寫字母,Spam 可以匹配 "Spam", "spam", 或 "spAM"。這個小寫字母并不考慮當前位置。
 3  
 4 L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale
 5 影響 "w, "W, "b, 和 "B,這取決于當前的本地化設置。
 6 locales 是 C 語言庫中的一項功能,是用來為需要考慮不同語言的編程提供幫助的。舉個例子,如果你正在處理法文文本,你想用 "w+ 來匹配文字,但 "w 只匹配字符類 [A-Za-z];它并不能匹配 "é""?"。如果你的系統
   配置適當且本地化設置為法語,那么內部的 C 函數將告訴程序 "é" 也應該被認為是一個字母。當在編譯正則表達式時使用 LOCALE 標志會得到用這些 C 函數來處理 "w 後的編譯對象;這會更慢,但也會象你希望的那樣可以
"w+ 來匹配法文文本。
 7  
 8 U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode locale
 9 統一成unicode編碼
10 
11 M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline
12 使用 "^" 只匹配字符串的開始,而 $ 則只匹配字符串的結尾和直接在換行前(如果有的話)的字符串結尾。當本標志指定後, "^" 匹配字符串的開始和字符串中每行的開始。同樣的, $ 元字符匹配字符串結尾和字符串中每行的
   結尾(直接在每個換行之前)。
13 
14 S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline
15 使 "." 特殊字符完全匹配任何字符,包括換行;沒有這個標志, "." 匹配除了換行外的任何字符。
16 
17 X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments
18 該標志通過給予你更靈活的格式以便你將正則表達式寫得更易于理解。當該標志被指定時,在 RE 字符串中的空白符被忽略,除非該空白符在字符類中或在反斜杠之後;這可以讓你更清晰地組織和縮進 RE。它也可以允許你將注釋寫
   入 RE,這些注釋會被引擎忽略;注釋用 "#"號 來標識,不過該符號不能在字符串或反斜杠之後。
View Code

?

?

?

?

re中的表示模式

收集于互聯網

模式

描述

^

匹配字符串的開頭

$

匹配字符串的末尾。

.

匹配任意字符,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符。

[...]

用來表示一組字符,單獨列出:[amk] 匹配 'a','m'或'k'

[^...]

不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。

re*

匹配0個或多個的表達式。

re+

匹配1個或多個的表達式。

re?

匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式

re{ n}

?

re{ n,}

精確匹配n個前面表達式。

re{ n, m}

匹配 n 到 m 次由前面的正則表達式定義的片段,貪婪方式

a| b

匹配a或b

(re)

G匹配括號內的表達式,也表示一個組

(?imx)

正則表達式包含三種可選標志:i, m, 或 x 。只影響括號中的區域。

(?-imx)

正則表達式關閉 i, m, 或 x 可選標志。只影響括號中的區域。

(?: re)

類似 (...), 但是不表示一個組

(?imx: re)

在括號中使用i, m, 或 x 可選標志

(?-imx: re)

在括號中不使用i, m, 或 x 可選標志

(?#...)

注釋.

(?= re)

前向肯定界定符。如果所含正則表達式,以 ... 表示,在當前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩余部分還要嘗試界定符的右邊。

(?! re)

前向否定界定符。與肯定界定符相反;當所含表達式不能在字符串當前位置匹配時成功

(?> re)

匹配的獨立模式,省去回溯。

\w

匹配字母數字

\W

匹配非字母數字

\s

匹配任意空白字符,等價于 [\t\n\r\f].

\S

匹配任意非空字符

\d

匹配任意數字,等價于 [0-9].

\D

匹配任意非數字

\A

匹配字符串開始

\Z

匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串。c

\z

匹配字符串結束

\G

匹配最后匹配完成的位置。

\b

匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

\B

匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

\n, \t, 等.

匹配一個換行符。匹配一個制表符。等

\1...\9

匹配第n個分組的子表達式。

\10

匹配第n個分組的子表達式,如果它經匹配。否則指的是八進制字符碼的表達式。

[Pp]ython?????????????????????????

匹配 "Python" 或 "python"??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

rub[ye]

匹配 "ruby" 或 "rube"

[aeiou]

匹配中括號內的任意一個字母

[0-9]

匹配任何數字。類似于 [0123456789]

[a-z]

匹配任何小寫字母

[A-Z]

匹配任何大寫字母

[a-zA-Z0-9]

匹配任何字母及數字

[^aeiou]

除了aeiou字母以外的所有字符

[^0-9]

匹配除了數字外的字符

?

?

1、re .match(pattern, string, flags=0)

re.match從起始位置開始根據模型去字符串中匹配指定內容,匹配單個

  • 正則表達式
  • 要匹配的字符串
  • 標志位,用于控制正則表達式的匹配方式

我們來看一個例子

1 import re
2 text = "111apple222pear"
3 f1 = re.match("\d+",text)
4 if f1:
5 print(f1.group())
6 else:
7 print("")運行一下試試,我們可以發現匹配到了111,所以我們可以確定的是,match匹配的是從起始位置來去匹配,起始位置匹配到了則正常,否則返回空 “\d+”表示匹配任意數字出現1次或者更多次,如果把+號變成{1,2}你就發現匹配的結果是11,這是因為{1,2}表示匹配一個或兩個
match

2、re.search(pattern, string, flags=0)

這個表示根據模式去匹配字符串中的匹配內容,也只匹配單個

1 import re
2 text = "aaa111apple222pear"
3 f1 = re.search("\d+",text)
4 if f1:
5 print(f1.group())
6 else:
7 print("")這個例子我們發現,re.search把111匹配出來了所以他就是從整個字符串中匹配出模式符合的字符串,并且只匹配第一個
searh

3、group()與groups()的區別

 1 import re
 2 text = "jnj111apple222pear"
 3 f1 = re.search("([0-9]+)([a-z]+)",text)
 4 if f1:
 5 print(f1.group(0),f1.group(1),f1.group(2)) print(f1.groups())
 6 else:
 7 print("")
 8  
 9 
10 我們看上面的例子運行一下你就知道group和groups的區別了,看到結果清晰可見,re模塊匹配到后會將值傳入子組,group()默認不寫參數就返回匹配的整個值,寫入參數就返回參數對應的值,而groups()則返回匹配到的值的元組
group()and groups()

4、re.finadll(pattern, string, flags=0)

 1 上面兩個例子我們不難看出都是匹配單個值的,那么finadll就是匹配所有符合條件的值
 2 
 3 import re
 4 text = "jnj111apple222pear"
 5 f1 = re.findall("([0-9]+)",text)
 6 if f1:
 7 print(f1)
 8 else:
 9 print("")
10 執行上面的例子,得到的結果是個列表,列表中包含著所有符合條件的值([0-9]+)也可以寫成(\d+)
finadll

5、re.sub(pattern, repl, string, count=0, flags=0)

1 用于替換匹配條件的字符串
2 
3 import re
4 text = "jnj111apple222pear"
5 f1 = re.sub("([a-z]+)",'A',text)
6 if f1:
7 print(f1)
8 else:
9 print("")輸出的結果是所有的字母全變成大寫的A了類似于str.repalce
sub

6、re.split(pattern, string, maxsplit=0, flags=0)

1 import re
2 content = "a1*b2c3*d4e5"
3 new_content = re.split('[\*]', content,2)
4 print (new_content)
5 表示以*號作為分割符保持在列表中類似于str.split
split

7、compile(pattern, flags=0)

將匹配規則賦予對象,這樣做的好處是可以提升匹配的速度

import re
content = "a1b*2c3*d4e5"
aaa = re.compile('[\*]')
new_content = re.split(aaa, content)
print (new_content)
還是上面的例子結果是一樣的據官方解釋說這種模式可以提升匹配的速率

8 、escape(string)?

將字符串中所有特殊正則表達式字符轉義
import re
content = "a1b*2c3*d4e5"
ccc = re.escape(content)
print(ccc)

三、小練習

會了這些對于我們就足夠了,對于復雜的匹配咱們可以百度一下滴,下面進行幾個小練習

①匹配出其中的年齡字段

字符串是:"name: aaa , age:22 , user:1112"

1 import re
2 str_in = 'name: aaa , age:22 , user:11121'
3 new_str_in = re.findall("[age]+\:\d{1,3}",str_in)
4 #表示age出現最低一次加上:號加上任意數字出現1到3次
5 print(new_str_in)
練習1

②匹配出字符串中的所有網址

字符串是:"The url is www.aaa.com wwa.ccc.dsa www.cdsa.c"
1 import re
2 str_in = "The url is www.aaa.com wwa.ccc.dsa www.cdsa.c"
3 new_str_in = re.findall("www\.\S*\..{2,3}",str_in)#以www加.加任意非空字符加任意字符出現次數為2到3次
4 print(new_str_in)
練習2

③算出括號中的值并進行替換

字符串是:"The name is xiaoyan The money I have (5+5),6-1'
1 import re
2 str_in = 'The name is xiaoyan The money I have (5+5),6-1'
3 new_str_in = re.findall("\(*\d+[\+]+\d+\)*",str_in)#匹配出括號中的內容
4 value = new_str_in[0].strip('(,)')#取出括號
5 n1, n2 = value.split('+')#以+作為分割付
6 new_value = str(int(n1)+int(n2))#進行計算
7 aaa = str_in.replace(new_str_in[0],new_value)#進行替換
8 print(aaa)
練習3

?

?