import reprint("----------匹配單個字符與數字----------")
r'''
. 匹配除換行符以外的任意字符
[0123456789] []是字符集合,表示匹配方括號中所有所包含的任意一個字符
[liuwang] [] 匹配‘l','i','u' 中任意一個字符
[a-z] 匹配任意小寫字母
[A-Z] 匹配任意大寫字母
[0-9] 匹配任意數字,類似[0123456789]
[0-9a-zA-Z] 匹配任意的數字和字母
[0-9a-zA-Z_] 匹配任意的數字、字母和下劃線
[^liuwang] 匹配除了l,i,u,w,a,n,g這幾個字母意外的所有字符
中括號中了 ^稱為脫字符 表示不匹配集合中的字符
[^0-9] 匹配所有的非數字字符
有 ^ 需要帶[]
\d 匹配數字,效果同[0-9]
\D 匹配非數字,效果同[^0-9]
\w 匹配數字,字母和下劃線,效果同[0-9a-zA-Z_]
\W 匹配非數字,字母和下劃線,效果同[^0-9a-zA-Z_]
\s 匹配任意的空白符(空格,換行,回車,換頁,制表)效果同[ \f\n\r\t]
\S 匹配任意的非空白符效果同[^ \f\n\r\t]'''
# print(re.findall("\D","liuwang is handsome6"))print("----------------錨字符--------------")
'''
^ 行首匹配,和在[]里的^不是一個意思
$ 行尾匹配
\A 匹配字符串開始,它和^的區別是,\A 只匹配整個字符串的開頭,即使在re.M模式下也不會匹配它行的行首
\Z 匹配字符串結束,他和$的區別是,\Z 只匹配整個字符串的開頭,即使在re.M模式下也不會匹配它行的行尾\b 匹配一個單詞的邊界,也就是值單詞和空格鍵的位置,可以匹配never 不能匹配nerve
\B 匹配非單詞的邊界,'''# print(re.search("some","liuwang is handesome"))
# print(re.findall("^liu","liuwang is handesome\nliuwang",re.M))
# print(re.findall("\Aliu","liuwang is handesome\nliuwang",re.M))
#
#
# print(re.search(r"er\b","nerve"))
# print(re.search(r"er\b","nnnever"))
# print(re.search(r"er\B","nnnevre"))
# print(re.search("er\B","nerve"))print("----------------匹配多個字符--------------")
'''
說明:下方的x、y、z 均為假設的普通字符,不是正則表達式的元字符
(xyz) 匹配小括號內的xyz (作為一個整體去匹配)
x? 匹配0個或者1個x #非貪婪匹配
x* 匹配0個或者多個x #貪婪匹配
(.* 表示匹配0個或者任意多個字符(換行符除外))
x+ 匹配至少一個x #貪婪匹配x{n} 匹配確定的n個x(n是一個非負整數)
x{n,} 匹配至少n個x
x{n,m} 匹配至少n個最多m個x,注意:n<=m
x|y |表示或 匹配x或者y
'''
print(re.findall(r"a?", "aaa"))#非貪婪匹配(盡可能少的匹配)
print(re.findall(r"a*", "aaabaa"))#貪婪匹配(盡可能多的匹配)
print(re.findall(r"a+", "aaabaaaaaa"))#貪婪匹配(盡可能多的匹配)
print(re.findall(r"a{3}", "aaabaa"))
print(re.findall(r"a{3,}", "aaaaabaaa"))#貪婪匹配(盡可能多的匹配)
print(re.findall(r"a{3,6}", "aaaabaaa"))
print(re.findall(r"((s|S)unck)", "sunck--SuNck"))#需求,提取sunck...man
str = " sunck is a good man ! sunck is a nice man!sunck is a very handesome man"
print(re.findall(r"(sunck.*?man$)",str))print("-------------特殊---------------")
'''
*? +? ??最小匹配 通常都是盡可能多的模式,可以使用這種解決貪婪匹配(?:x) 類似(xyz)但不表示一個組
'''
#注釋/* part1 */ */ part2 */
print(re.findall(r"//*.*/*/",r"/* part1 */ */ part2 */"))
?