(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')]
.
所表示的任意字符不包括換行符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
search和findall默認匹配第一個左括號對應的內容linux
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')]
給定一個數字串,找出把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)) # [],多此一舉
默認狀況下,每一個左括號都對應一個group。使用非捕獲組,可讓左括號不參與組的計數。windows
import re s = "ABC" print(re.findall('(.((.).))', s)) # [('ABC', 'BC', 'B')] print(re.findall('(?:.((.).))', s)) # [('BC', 'B')] print(re.findall('(?:.(?:(.).))', s)) # ['B']
零寬斷言一共有四種:(前+後)*(等+不等)數組
(?=X)
後面必須是X(?!X)
後面必須不是X(?<=X)
前面必須是X(?<!X)
前面必須不是X其中X能夠是任意正則表達式。
有一個隨機數字串,找出包含在0,1之間的數字串,要求:併發
0\d+1
這種形式import re s = "1023120513" print(re.findall("(?<=[^2]0)\d+?(?=1[^3])", s))
直接輸出'23',零寬斷言的好處在於:避免了經過group進一步摘取內容。線程
格式:(?imsx-imsx:Pattern)
例(1):(?i)ab(?-i)cd
可匹配abcd,Abcd,ABcd,aBcd
(?i)開啓忽略大小寫功能
(?-i)開啓大小寫敏感開關code
例(2):(?i:a)b
,可匹配ab和Ab
\d+?
可匹配儘可能少的\d,此即爲非貪婪模式。
\d+
可匹配儘可能多的\d,這是默認狀況下,此爲貪婪模式
js獲取正則表達式有以下兩種方式:
獲得的array是字符串數組,表示各個group,有兩種獲取分組的方式
regex.test(str)能夠以bool值的形式獲取str中是否包含regex。