##什麼是正則
'''
正則就是用一些具備特殊含義的符號組合到一塊兒(稱爲正則表達式)來描述字符或者字符
串的方法。或者說:正則就是用來描述一類事物的規則。(在Python中)它內嵌在Python中,
並經過 re 模塊實現。正則表達式模式被編譯成一系列的字節碼,而後由用 C 編寫的匹配引
擎執行.
'''python
import re # print(re.findall('\w','hello_ | egon 123')) #匹配字母數字下劃線,單個字符進行匹配 # print(re.findall('\W','hello_ | egon 123')) #匹配非字母數字下劃線 # print(re.findall('\s','hello_ | egon 123 \n \t')) # print(re.findall('\S','hello_ | egon 123 \n \t')) # print(re.findall('\d','hello_ | egon 123 \n \t')) # print(re.findall('\D','hello_ | egon 123 \n \t')) # print(re.findall('h','hello_ | hello h egon 123 \n \t')) # # print(re.findall('\Ahe','hello_ | hello h egon 123 \n \t')) # print(re.findall('^he','hello_ | hello h egon 123 \n \t')) # # print(re.findall('123\Z','hello_ | hello h egon 123 \n \t123')) # print(re.findall('123$','hello_ | hello h egon 123 \n \t123')) # print(re.findall('\n','hello_ | hello h egon 123 \n \t123')) # print(re.findall('\t','hello_ | hello h egon 123 \n \t123'))
['h', 'e', 'l', 'l', 'o', '_', 'e', 'g', 'o', 'n', '1', '2', '3'] [' ', '|', ' ', ' '] [' ', ' ', ' ', ' ', '\n', ' ', '\t'] ['h', 'e', 'l', 'l', 'o', '_', '|', 'e', 'g', 'o', 'n', '1', '2', '3'] ['1', '2', '3'] ['h', 'e', 'l', 'l', 'o', '_', ' ', '|', ' ', 'e', 'g', 'o', 'n', ' ', ' ', '\n', ' ', '\t'] ['h', 'h', 'h'] ['he'] ['he'] ['123'] ['123'] ['\n'] ['\t']
#. [] [^] #.自己表明任意一個字符
# print(re.findall('a.c','a a1c a*c a2c abc a c aaaaaac aacc'))
#a.c
# print(re.findall('a.c','a a1c a*c a2c abc a\nc',re.DOTALL))
# print(re.findall('a.c','a a1c a*c a2c abc a\nc',re.S))
#[]內部能夠有多個字符,可是自己只配多個字符中的一個
# print(re.findall('a[0-9][0-9]c','a a12c a1c a*c a2c a c a\nc',re.S))
# print(re.findall('a[a-zA-Z]c','aac abc aAc a12c a1c a*c a2c a c a\nc',re.S))
# print(re.findall('a[^a-zA-Z]c','aac abc aAc a12c a1c a*c a2c a c a\nc',re.S))
# print(re.findall('a[\+\/\*\-]c','a-c a+c a/c aac abc aAc a12c a1c a*c a2c a c a\nc',re.S))
['a12c'] ['aac', 'abc', 'aAc'] ['a1c', 'a*c', 'a2c', 'a c', 'a\nc'] ['a-c', 'a+c', 'a/c', 'a*c']
#\:轉義
# print(re.findall(r'a\\c','a\c abc')) #rawstring
#? * + {}:左邊有幾個字符,若是有的話,貪婪匹配
#?左邊那一個字符有0個或者1個 # print(re.findall('ab?','aab a ab aaaa')) #ab?
#*左邊那一個字符有0個或者無窮個
# print(re.findall('ab*','a ab abb abbb abbbb bbbbbb'))
# print(re.findall('ab{0,}','a ab abb abbb abbbb bbbbbb'))
['a', 'ab', 'abb', 'abbb', 'abbbb'] ['a', 'ab', 'abb', 'abbb', 'abbbb']
#+左邊那一個字符有1個或者無窮個
# print(re.findall('ab+','a ab abb abbb abbbb bbbbbb'))
# print(re.findall('ab{1,}','a ab abb abbb abbbb bbbbbb')) #{n,m}左邊的字符有n-m次
# print(re.findall('ab{3}','a ab abb abbb abbbb bbbbbb'))
# print(re.findall('ab{2,3}','a ab abb abbb abbbb bbbbbb')) # .* .*?
['ab', 'abb', 'abbb', 'abbbb'] ['ab', 'abb', 'abbb', 'abbbb'] ['abbb', 'abbb'] ['abb', 'abbb', 'abbb']
#.*貪婪匹配 找最多的 # print(re.findall('a.*c','a123c456c'))
#.*?非貪婪匹配 # print(re.findall('a.*?c','a123c456c')) #| 或者 任意批配
# print(re.findall('company|companies','Too many companies have gone bankrupt, and the next one is my company'))
# company|companies
# print(re.findall('compan|companies','Too many companies have gone bankrupt, and the next one is my company'))
['companies', 'company'] ['compan', 'compan']
#():分組
# print(re.findall('ab+','abababab123'))
# print(re.findall('ab+123','abababab123'))
['ab', 'ab', 'ab', 'ab'] ['ab123']
# print(re.findall('ab','abababab123')) # print(re.findall('(ab)','abababab123')) # print(re.findall('(a)b','abababab123')) # print(re.findall('a(b)','abababab123')) # print(re.findall('(ab)+','abababab123')) # print(re.findall('(?:ab)+','abababab123')) #?: 匹配完整詞語
['ab', 'ab', 'ab', 'ab'] ['ab', 'ab', 'ab', 'ab'] ['a', 'a', 'a', 'a'] ['b', 'b', 'b', 'b'] ['ab'] ['abababab']
# print(re.findall('(ab)+123','abababab123')) # print(re.findall('(?:ab)+123','abababab123')) # print(re.findall('(ab)+(123)','abababab123'))
['ab'] ['abababab123'] [('ab', '123')]
# print(re.findall('compan(y|ies)','Too many companies have gone bankrupt, and the next one is my company')) # print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))
['ies', 'y'] ['companies', 'company']
#re的其餘方法 search 找成功一次就結束 match 從頭開始是匹配 # print(re.findall('ab','abababab123')) # print(re.search('ab','abababab123').group()) # print(re.search('ab','12aasssdddssssssss3')) # print(re.search('ab','12aasssdddsssssssab3sssssss').group())
['ab', 'ab', 'ab', 'ab'] ab None ab
# print(re.search('ab','123ab456')) # print(re.match('ab','123ab456'))
# print(re.search('^ab','123ab456'))
# split 切分
# print(re.split('b','abcde')) # print(re.split('[ab]','abcde'))
# sub 替換 # print(re.sub('alex','SB','alex make love alex alex',1)) #1是替換一次,也可不用該參數 # print(re.subn('alex','SB','alex make love alex alex',1)) #顯示替換幾回 # print(re.sub('(\w+)(\W+)(\w+)(\W+)(\w+)',r'\5\2\3\4\1','alex make love')) #\w 匹配單詞 \W 匹配非單詞 12345 表明匹配的組 # print(re.sub('(\w+)( .* )(\w+)',r'\3\2\1','alex make love')) # obj=re.compile('\d{2}') #定義一個正則表達式,數字出現兩次 # print(obj.search('abc123eeee').group()) #12 # print(obj.findall('abc123eeee')) #12
<_sre.SRE_Match object; span=(3, 5), match='ab'> None
None ['a', 'cde'] ['', '', 'cde'] SB make love alex alex ('SB make love alex alex', 1) love make alex love make alex 12 ['12']
print(re.findall('\-?\d+\.?\d+',"1-12*(60+(-40.35/5)-(-4*3))")) print(re.findall('\-?\d+\.?\d*',"1-12*(60+(-40.35/5)-(-4*3))")) # print(re.findall('\-?\d+\.\d+',"1-12*(60+(-40.35/5)-(-4*3))")) # print(re.findall('\-?\d+',"1-12*(60+(-40.35/5)-(-4*3))")) # print(re.findall('\-?\d+\.\d+|(\-?\d+)',"1-12*(60+(-40.35/5)-(-4*3))")) # print(re.findall('\-?\d+\.\d+|\-?\d+',"1-12*(60+(-40.35/5)-(-4*3))")) # print(re.findall('\-?\d+|\-?\d+\.\d+',"1-12*(60+(-40.35/5)-(-4*3))"))
['-12', '60', '-40.35'] ['1', '-12', '60', '-40.35', '5', '-4', '3'] ['-40.35'] ['1', '-12', '60', '-40', '35', '5', '-4', '3'] ['1', '-12', '60', '', '5', '-4', '3'] ['1', '-12', '60', '-40.35', '5', '-4', '3'] ['1', '-12', '60', '-40', '35', '5', '-4', '3']