天天看點

正規表達式的元字元

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      */"))