import re
print('--------------比對單個字元與數字---------------------')
r"""
. 比對除換行符以外的任意字元
[0123456789] []是字元集和,表示比對方括号中所包含的任意一個字元
[aspiring] 比對'a','s','p','i','r','i','n','g'中任意一個字元
[a-z] 比對任意小寫字母
[A-Z] 比對任意大寫字母
[0-9] 比對任意數字,類似[0123456789]
[0-9a-zA-Z] 比對任意的數字和字母
[0-9a-zA-Z_] 比對任意的數字、字母和下劃線
[^aspiring] 比對除了aspiring這幾個字母以外的所有字元,中括号裡的^稱為脫字元,表示不比對集合中的字元
[^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('.', 'aspiring is a good man \n 1 2 3',flags=re.S))
print('---')
print(re.findall('[^</p>]',"<p>test</p>"))
print("---------------錨字元(邊界字元)---------------------")
'''
^ 行首比對,和在[]裡的^不是一個意思
$ 行尾比對
\A 比對字元串開始,它和^的差別是,\A隻比對整個字元串的開頭,即使在re.M模式下也不會比對它行的行首
\Z 比對字元串結束,它和$的差別是,\Z隻比對整個字元串的結束,即使在re.M模式下也不會比對它行的行尾
\b 比對一個單詞的邊界,也就是單詞和空格間的位置
'er\b'可以比對never,不能比對nerve
\B 比對非單詞的邊界
'''
print(re.search('^aspiring','aspiring is a good man'))
# print(re.search('man$','aspiring is a good man'))
print(re.findall('^aspiring','aspiring is a good man\naspiring is a nice man',flags=re.M))
print(re.findall('\Aaspiring','aspiring is a good man\naspiring is a nice man',flags=re.M))
print(re.findall('man$','aspiring is a good man\naspiring is a nice man',flags=re.M))
print(re.findall('man\Z','aspiring is a good man\naspiring is a nice man',flags=re.M))
print(re.search(r'er\b', 'never'))
print(re.search(r'er\b', 'nerve'))
print(re.search(r'er\B', 'never'))
print(re.search(r'er\B', 'nerve'))
print('---------------比對多個字元---------------------')
'''
說明:下方的x、y、z均為假設的普通字元,不是正規表達式的元字元(xyz),n、m(非負整數) 比對小括号内的xyz(作為一個整體去比對)
x? 比對0個或者1個x
x* 比對0個或者任意多個x(.*表示比對0個或者任意多個字元(換行符除外))
x+ 比對至少一個x
x{n} 比對确定的n個x(n是一個非負整數)
x{n,} 比對至少n個x
x{m,n} 比對至少m個最多n個x。注意:m <= n
x|y |表示或,比對的是x或y
'''
print(re.findall(r'(aspiring)', 'aspiringgood is a good man,aspiring is a nice man'))
print(re.findall(r'a?', 'aaaagaaaa')) #非貪婪比對(盡可能少的比對)
print(re.findall(r'a*', 'aaaabaaaa')) #貪婪比對(盡可能多的比對)
print(re.findall(r'a+', 'aaaabaaaa')) #貪婪比對(盡可能多的比對)
print(re.findall(r'a{3}', 'aaabaa'))
print(re.findall(r'a{3,}', 'aaaaabaaa')) #貪婪比對(盡可能多的比對)
print(re.findall(r'a{3,5}', 'aaaaaabaabaaa')) #貪婪比對(盡可能多的比對)
print(re.findall(r"((a|A)spiring)",'aspiring--Aspiring'))
# 需求,提取aspiring……man,
str = "aspiring is a good man! aspiring is a nice man! aspiring is a very handsome man"
print(re.findall(r'^aspiring.*?man$',str))
print('------------------特殊---------------------')
'''
*? +? x? 最小比對,通常都是盡可能多的比對,可以使用這種解決貪婪比對
(?:x) 類似(xyz),但不表示一個組
'''
# 注釋: /* part1 */ /* part2 */
print(re.findall(r"//*.*?/*/", r"/* part1 */ /* part2 */"))