正則表達式進階

1、分組

(A)((B)C)
各個group以下:
0 表示(A)((B)C),也就是匹配的所有
1 表示第一個左括號所包括的內容,即(A)
2 表示第二個左括號所包括的內容,即((B)C)
3 表示第三個左括號所包括的內容,即(B)javascript

import re
s="ABC"
res=re.findall('(.((.).))',s)
print(res) #[('ABC', 'BC', 'B')]

2、.所表示的任意字符不包括換行符

import re

s = """weiyinfu is great
haha yes
"""
x = re.search('is.*?yes', s)
print(x.group())

運行這段代碼會報錯,由於x爲None,正則表達式最多匹配一行java

若是有回車符,顯示會有問題
其實匹配正確,只是顯示錯誤,這讓人誤覺得正則表達式寫錯了。
回車符的做用就是刪除本行並把光標移動到行首,在windows下體現不出這一點,在linux下才能體現出來。python

import re

s = "weiyinfu is great \r haha yes"
x = re.search('is.*?yes', s)
print(x.group())#輸出爲 haha yes

3、脫殼處理

search和findall默認匹配第一個左括號對應的內容linux

  • 若是正則表達式中僅有一對括號,那麼直接返回這對括號內的內容,也就是直接返回一個字符串
  • 若是正則表達式中包含多對括號,那麼返回一個字符串元組
  • Python中的正則表達式會自動把僅包含一個字符串的元組改寫爲字符串類型,此操做稱之爲脫殼
import re

s = "11321323"
res = re.findall('(\d+?)2', s)  # ['113', '13']
print(res)
print(re.search("(\d+?)2", s).groups())  # ('113',)
print(re.search("(\d+?)2", s).group(0))  # 1132
print(re.findall("((\d+?)2)", s))  # [('1132', '113'), ('132', '13')]
print(re.findall("((\d+?))2", s))  # [('113', '113'), ('13', '13')]

3、反向引用

給定一個數字串,找出把2夾在中間的所有數字,例如323,121等。正則表達式

import re

s = "11321323"
print(re.findall('(\d)2\\1', s))  # ['3']
print(re.findall(r'(\d)2\1', s))  # ['3']
print(re.findall(r'(\d)2\\1', s))  # [],多此一舉

4、非捕獲組

默認狀況下,每一個左括號都對應一個group。使用非捕獲組,可讓左括號不參與組的計數。windows

import re

s = "ABC"
print(re.findall('(.((.).))', s))  # [('ABC', 'BC', 'B')]
print(re.findall('(?:.((.).))', s))  # [('BC', 'B')]
print(re.findall('(?:.(?:(.).))', s))  # ['B']

5、零寬斷言

零寬斷言一共有四種:(前+後)*(等+不等)數組

  • (?=X) 後面必須是X
  • (?!X) 後面必須不是X
  • (?<=X) 前面必須是X
  • (?<!X) 前面必須不是X

其中X能夠是任意正則表達式。
有一個隨機數字串,找出包含在0,1之間的數字串,要求:併發

  1. 0前面不能是2
  2. 1後面不能是3
  3. 0、1之間指0\d+1這種形式
import re

s = "1023120513"
print(re.findall("(?<=[^2]0)\d+?(?=1[^3])", s))

直接輸出'23',零寬斷言的好處在於:避免了經過group進一步摘取內容。線程

6、模式開關

格式:(?imsx-imsx:Pattern)
例(1):(?i)ab(?-i)cd可匹配abcd,Abcd,ABcd,aBcd
(?i)開啓忽略大小寫功能
(?-i)開啓大小寫敏感開關code

例(2):(?i:a)b,可匹配ab和Ab

7、貪婪模式和非貪婪模式

\d+?可匹配儘可能少的\d,此即爲非貪婪模式。
\d+可匹配儘可能多的\d,這是默認狀況下,此爲貪婪模式

8、JavaScript中的正則表達式

js獲取正則表達式有以下兩種方式:

  • array=str.match(regex)
  • array=regex.exec(str)

獲得的array是字符串數組,表示各個group,有兩種獲取分組的方式

  • array[0],array[1],這是推薦方式
  • RegExp.$1,RegExp.$2,經過全局變量來獲取,這種方式正常運行的前提是:JavaScript是單線程的,不會出現併發衝突。這種方式應該儘可能避免使用。

regex.test(str)能夠以bool值的形式獲取str中是否包含regex。

相關文章
相關標籤/搜索