日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python正则表达式笔记

發(fā)布時間:2023/12/3 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python正则表达式笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正則表達式

  • 作用
  • 函數(shù)
    • 函數(shù)參數(shù)
    • 查找函數(shù)
      • re.findall()
      • re.search()
      • re.match()
      • re.finditer()
    • re.compile()函數(shù)
    • 替換函數(shù)
      • re.sub(pattern,repl,string,count=0,flags=0)
      • re.subn()
    • 分割函數(shù)
      • re.split()
  • 模式串字符
    • 字符類別表達(匹配單個字符)
      • \d
      • \D
      • \s
      • \S
      • \w
      • \W
      • [a-z]
      • [^a-z]
      • .
    • 多次匹配字符
      • *
      • +
      • {2}
      • {1,3}
    • 組合模式
      • [0-9][a-z]
      • |
      • {}
    • 位置
      • ^
      • $
      • \b
      • \B
      • (?=...)
      • (?!...)
      • (?<=...)
      • (?<!...)
    • 分組
      • ()
  • 其他概念
    • 貪婪模式和非貪婪模式
    • r的作用

作用

正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。

函數(shù)

函數(shù)參數(shù)

正則表達式所有的函數(shù)一般都包括三個參數(shù):

  • 第一個參數(shù):pattern
    匹配的正則表達式,類似數(shù)據(jù)結(jié)構(gòu)的模式串或子串。
  • 第二個參數(shù):string
  • 要匹配的字符串,類似數(shù)據(jù)結(jié)構(gòu)的主串。
  • 最后一個參數(shù):flags=0
    標志位,用于控制正則表達式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。可選標志如下:
字符功能
re.I使匹配對大小寫不敏感
re.M多行匹配,影響 ^ 和 $
re.S使 . 匹配包括換行在內(nèi)的所有字符

查找函數(shù)

re.findall()

功能:在字符串中找到正則表達式所匹配的所有子串,并返回一個列表。
如果沒有找到匹配的,則返回空列表。

示例代碼:

import re str='她們分別叫做御坂10086和御坂12306' x=re.findall('御坂',str) print(x)

輸出:

['御坂', '御坂']

re.search()

功能:查找模式串,只返回查找到的第一個結(jié)果。
返回Match對象,包括匹配到的結(jié)果以及其在字符串中的位置。

對于Match對象:

  • 使用.group()可獲取搜索到的值。
  • 使用.span()可獲取搜索到的值在主串中的位置(下標從0開始)。
  • 使用.start()可獲取搜索到的值在主串中的開始位置。
  • 使用.end()可獲取搜索到的值在主串中的結(jié)束位置。

示例代碼:

import re str='她們分別叫做御坂10086和御坂12306' x=re.search('御坂',str) print(x) print(x.group()) print(x.span()) print(x.start()) print(x.end())

輸出:

<re.Match object; span=(6, 8), match='御坂'> 御坂 (6, 8) 6 8

re.match()

功能:從主串的開頭查找模式串,如果主串的開頭是模式串,則只返回查找到的結(jié)果。否則返回None
返回Match對象,包括匹配到的結(jié)果以及其在字符串中的位置。
使用.group()可獲取搜索到的值。
和re.search()的區(qū)別是re.match()增加了必須在主串開頭處匹配的限制。

示例代碼:

str='sa加藤惠saber加藤惠sakura加藤惠' x=re.match('加藤惠',str) x1=re.match('sa',str) print(x) print(x1)

輸出:

None <re.Match object; span=(0, 2), match='sa'>

re.finditer()

功能:查找模式串,返回一個迭代器。
迭代器中的每個元素是Match對象。

示例代碼:

str='加藤惠saber加藤惠sakura加藤惠' iter=re.finditer(r'加藤惠',str) for x in iter:print(x)

輸出:

<re.Match object; span=(0, 3), match='加藤惠'> <re.Match object; span=(8, 11), match='加藤惠'> <re.Match object; span=(17, 20), match='加藤惠'>

re.compile()函數(shù)

功能:用于編譯正則表達式,生成一個正則表達式(Pattern)對象。
re.compile()函數(shù)的參數(shù)為模式串和標志位。
生成的pattern對象供match()和search()這兩個函數(shù)使用。
下面以search()舉例,用match()也是類似的。

示例代碼:

str='她們分別叫做御坂10086和御坂12306' pattern=re.compile('御坂') x=pattern.search(str) print(x)

輸出:

<re.Match object; span=(6, 8), match='御坂'>

pattern.search(string,pos,endpos)中的參數(shù):

  • 參數(shù)1表示主串
  • 參數(shù)2表示從主串的pos位置開始匹配,默認從主串開始位置開始匹配。
  • 參數(shù)3表示從主串的endpos位置結(jié)束匹配,默認從主串結(jié)尾位置結(jié)束匹配。

使用re.compile()函數(shù)編譯后使用pattern.search()函數(shù)的結(jié)果和直接使用re.search()函數(shù)的結(jié)果一樣。
pattern.search()函數(shù)z只是在re.search()函數(shù)功能上增加了按照指定主串的位置來匹配參數(shù)。

替換函數(shù)

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

參數(shù):

  • 參數(shù)1:模式串
  • 參數(shù)2:用來替換的字符串,也可以是個函數(shù)。
  • 參數(shù)3:主串
  • 參數(shù)4:替換的最大次數(shù),默認為0,代表不限制次數(shù)。
  • 參數(shù)5:標志位,re.I等

示例代碼:

str='加藤惠saber加藤惠sakura加藤惠' x=re.sub('加藤惠','英梨梨',str) print(x)

輸出:

英梨梨saber英梨梨sakura英梨梨

re.subn()

功能:在re.sub()的基礎(chǔ)上增加了返回替換次數(shù)的功能。

示例代碼:

str='加藤惠saber加藤惠sakura加藤惠' x=re.subn('加藤惠','英梨梨',str) print(x)

輸出:

('英梨梨saber英梨梨sakura英梨梨', 3)

分割函數(shù)

re.split()

功能:按照匹配的模式串來分割主串,然后返回列表。
除了模式串和主串,還有參數(shù)maxsplit,表示分割次數(shù),默認為0,表示不限制次數(shù)。

示例代碼:

str='加藤惠saber加藤惠sakura加藤惠asuna' x=re.split('加藤惠',str) x1=re.split('加藤惠',str,maxsplit=2) print(x) print(x1)

輸出:

['', 'saber', 'sakura', 'asuna'] ['', 'saber', 'sakura加藤惠asuna']

模式串字符

字符類別表達(匹配單個字符)

表達某一類字符,比如數(shù)字,字母等。

\d

用來匹配任意單個數(shù)字。

示例代碼:

str='j_k加藤惠!!123' x=re.findall(r'\d',str) print(x)

輸出:

['1', '2', '3']

\D

用來匹配任意單個非數(shù)字字符。

示例代碼:

str='j_k加藤惠!!123' x=re.findall(r'\D',str) print(x)

輸出:

['j', '_', 'k', '加', '藤', '惠', '!', '!']

\s

用來匹配任意單個空格。

示例代碼:

str='先 有圣人 后 有天' x=re.findall(r'\s',str) print(x)

輸出:

[' ', ' ', ' ']

\S

用來匹配任意單個非空格字符。

示例代碼:

str='先 有圣人 后 有天' x=re.findall(r'\S',str) print(x)

輸出:

['先', '有', '圣', '人', '后', '有', '天']

\w

用來匹配任意單個漢字、字母、數(shù)字或下劃線字符。

示例代碼:

str='j_k加藤惠!!' x=re.findall(r'\w',str) print(x)

輸出:

['j', '_', 'k', '加', '藤', '惠']

\W

用來匹配任意單個除了漢字、字母、數(shù)字和下劃線之外的任意字符

示例代碼:

str='j_k加藤惠!!' x=re.findall(r'\W',str) print(x)

輸出:

['!', '!']

[a-z]

[]表示可以匹配中括號中出現(xiàn)的任意單個字符,并且支持 -
[a-z]表示可以匹配字母a-z中任意單個字符。
[A-Z],[a-zA-Z0-9]也可以這樣類比。

示例代碼:

str='j_k加藤惠MM!!123' x=re.findall(r'[a-z]',str) print(x)

輸出:

['j', 'k']

[^a-z]

取反操作,表示除了字母a-z中任意單個字符

示例代碼:

str='j_k加藤惠MM!!123' x=re.findall(r'[^a-z]',str) print(x)

輸出:

['_', '加', '藤', '惠', 'M', 'M', '!', '!', '1', '2', '3']

.

表示除/n之外的任意單個字符。

示例代碼:

str='j_k加藤惠MM!!123\n' x=re.findall('.',str) print(x)

輸出:

['j', '_', 'k', '加', '藤', '惠', 'M', 'M', '!', '!', '1', '2', '3']

多次匹配字符

匹配多個字符。

*

用來匹配0或多個字符

示例代碼:

str='加j藤k惠mm英eee梨riri梨\n' x=re.findall('[a-z]*',str) print(x)

輸出:

['', 'j', '', 'k', '', 'mm', '', 'eee', '', 'riri', '', '', '']

+

用來匹配1或多個字符

示例代碼:

str='加j藤k惠mm英eee梨riri梨\n' x=re.findall('[a-z]+',str) print(x)

輸出:

['j', 'k', 'mm', 'eee', 'riri']

用來匹配0或1個字符,并且啟用非貪心模式。

示例代碼:

str='加藤惠mm加藤惠' x=re.findall('(加.惠)?',str) print(x)

輸出:

['加藤惠', '', '', '加藤惠', '']

{2}

用來匹配2個字符

示例代碼:

str='加j藤k惠mm英eee梨riri梨\n' x=re.findall('[a-z]{2}',str) print(x)

輸出:

['mm', 'ee', 'ri', 'ri']

{1,3}

用來匹配1-3個字符
另外{0,3}表示匹配0-3個字符,{1,}表示匹配一個以上字符。

示例代碼:

str='加j藤k惠mm英eee梨riri梨\n' x=re.findall('[a-z]{1,3}',str) print(x)

輸出:

['j', 'k', 'mm', 'eee', 'rir', 'i']

組合模式

將多個模式組合在一起,可以拼接也可以二選一等。

[0-9][a-z]

將模式直接拼接在一起,表示匹配形如單個數(shù)字+單個小寫字母的兩個字符

示例代碼:

str='加2j1藤k惠m3m英eee梨ri9ri梨\n' x=re.findall('[0-9][a-z]',str) print(x)

輸出:

['2j', '3m', '9r']

|

或操作,表示可以匹配任意一種模式

示例代碼:

str='加藤惠m3m英梨梨123\n' x=re.findall('[0-9]|[a-z]',str) print(x)

輸出:

['j', 'k', 'mm', 'eee', 'rir', 'i']

{}

表示在分組后可以以組為單位應(yīng)用量詞。
()表示分組。
如:(abc){3}表示abcabcabc。

示例代碼:

str='abcabcabc加藤惠mm英梨梨abcabcabc\n' x=re.findall('(abc){3}',str) print(x)

輸出:

['abc', 'abc']

位置

限定模式串出現(xiàn)的位置,比如行首,行尾或者在特定符之后等。

^

匹配在字符串開頭的模式串。
否則返回空列表。

示例代碼:

str='加藤惠mm英梨梨\n' x=re.findall('^mm',str) y=re.findall('^加藤惠',str) print(x) print(y)

輸出:

[] ['加藤惠']

$

匹配在字符串末尾的模式串。
否則返回空列表。
注意:$需放在模式串后面。

示例代碼:

str='加藤惠mm英梨梨\n' x=re.findall('mm$',str) y=re.findall('英梨梨$',str) print(x) print(y)

輸出:

[] ['英梨梨']

\b

匹配在邊界的模式串。
\b所表示的邊界,是字母、數(shù)字、漢字與特殊字符的邊界,放在模式串右邊則表示字符右邊界。此時字母、數(shù)字、漢字均可視為同一類字符。

示例代碼:

str='123.megumi我我我' x=re.findall(r'\bme',str) #必須加r或者使用\\b x1=re.findall(r'mi\b',str) print(x) print(x1)

輸出:

['me'] []

\B

匹配在非單詞邊界的模式串。
與\b完全相反,只要字母、數(shù)字、漢字之間沒有特殊字符都可以匹配。

示例代碼:

str='123.megumi我我我' x=re.findall(r'\Bme',str) x1=re.findall(r'mi\B',str) print(x) print(x1)

輸出:

[] ['mi']

(?=…)

匹配出現(xiàn)在…之前的模式串。
(?=…)需放在模式串右邊。
另外這里的之前非常嚴格,必須是緊挨著…模式串才能匹配到。

示例代碼:

str='saber加藤惠sabersakura' x=re.findall(r'saber(?=sakura)',str) #匹配sakura之前的saber print(x)

輸出:

['saber']

(?!..)

匹配不出現(xiàn)在…之前的模式串。
(?!..)需放在模式串右邊。
這里的之前也非常嚴格,必須是緊挨著…模式串才能匹配到。

示例代碼:

str='saber,saber加藤惠sabersakura' x=re.findall(r'saber(?!sakura)',str) #匹配除了sakura前面以外的saber print(x)

輸出:

['saber', 'saber']

(?<=…)

匹配出現(xiàn)在…之后的模式串。
(?<=…)需放在模式串左邊。
這里的之后非常嚴格,必須是緊挨著…模式串才能匹配到。

示例代碼:

str='加藤惠saber加藤惠sakura加藤惠' x=re.findall(r'(?<=sakura)加藤惠',str) #只匹配sakura之后的加藤惠 print(x)

輸出:

['加藤惠']

(?<!..)

匹配不出現(xiàn)在…之后的模式串。
(?<=…)需放在模式串左邊。
這里的之后非常嚴格,必須是緊挨著…模式串才能匹配到。

示例代碼:

str='加藤惠saber加藤惠sakura加藤惠' x=re.findall(r'(?<!sakura)加藤惠',str) print(x)

輸出:

['加藤惠', '加藤惠']

分組

()

用來將字符打包成一個組處理
只會匹配出()的內(nèi)容,()外的內(nèi)容都是作為條件而已。

對于search(),findall()這種只匹配一個對象的函數(shù),返回的Match對象只能返回一個最外面一層的分組。
對于Match對象,可以使用.groups()查看匹配到的每個分組。

示例代碼:

str='加藤惠saber加藤惠sakura加藤惠' x=re.search(r'((加藤惠)s)',str) y=re.findall(r'((加藤惠)s)',str) print(x) #只返回最外層的一個分組 print(x.group()) print(x.groups()) #查看所有分組 print(y)

輸出:

<re.Match object; span=(0, 4), match='加藤惠s'> 加藤惠s ('加藤惠s', '加藤惠') [('加藤惠s', '加藤惠'), ('加藤惠s', '加藤惠')]

其他概念

貪婪模式和非貪婪模式

貪婪匹配:最大長度匹配。
非貪婪匹配:最少長度匹配。
舉例:

string='abcabc' #主串(要被匹配的字符串) pattern='ab.*c' #模式串(匹配的正則表達式)

貪婪匹配結(jié)果為abcabc。
非貪婪匹配結(jié)果為abc。

默認為貪婪模式。在量詞后面加個問號?就是非貪婪模式。這個問號稱為非貪婪限定符
量詞如:{m,n},*,+,?

r的作用

如:r"123",避免轉(zhuǎn)義字符\在字符串中起作用。

參考:菜鳥驛站

總結(jié)

以上是生活随笔為你收集整理的Python正则表达式笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。