——
活動地址:CSDN21天學習挑戰賽
————
一名大學牲,參與本次21天學習挑戰賽,一個是為了充實自己的暑假,不在暑假過度放松,第二個就是想要去學會 python 這門語言了。
自己的專業方向是網絡安全,不過只要是計算機類都是多多少少需要掌握一兩門語言吧。而 python語言,就是大部分人都會去選擇的語言,同時也是我所選擇的。
在這之前,也有一點點的 python 基礎,會寫一些簡單的語法。相比其它語言,python 的語法格式還是更為簡潔的,用起來也很方便,希望在後面的學習中能夠對 python 有更多的理解與掌握。
————
每周三次以上學習,每次學習記錄做好筆記。並完成每周三次發博文任務。
—————
正則表達式已經內嵌在Python中,通過import re模塊就可以使用。
作用:
進行檢索字符串,對某些字符進行匹配等
使用場景:
爬蟲爬取數據時、數據開發、文本檢索和數據篩選
——
各正則表達式運算符的優先級順序:
相同優先級的從左到右進行運算,不同優先級的運算先高後低
——
需要通過正則表達式對字符串進行匹配的時候,就要用到這個模塊。
match方法基本使用:re.match(pattern, string, flags=0)
pattern: 匹配的正則表達式。
string: 要匹配的字符串。
flags: 標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
例子:
import re
a = re.match("abc","abcd")
print(a.group())
match方法進行匹配。group 方法進行提取匹配到的數據。
在match() 函數中,表示我要在 abcd
字符串中匹配 abc
字符串,然後結果就在 abcd 中匹配到了 abc 。實際中,"abc
"位置表示的正則表達式可能並沒有這麼簡單,可能有很多的運算符。
——
——
"."
的用法.:
匹配除 “\n” 之外的任何單個字符。要匹配包括 ‘\n’ 在內的任何字符,使用象 ‘[.\n]’ 的模式。
測試例子:
import re
a = re.match("a.c","agckw")
print(a.group())
——
[ ]
的用法[...]:
用來表示一組字符,單獨列出:[amk] 匹配 ‘a’,‘m’或’k’
測試例子:
import re
a = re.match("[A-Z]gc","Hgckw")
print(a.group())
——
\d
的用法\d:
匹配任意數字,等價於 [0-9]。
測試例子:
import re
a = re.match("Hg\dc","Hg6ckw")
print(a.group())
單字符匹配的字符:
. :
匹配除 “\n” 之外的任何單個字符。要匹配包括‘\n’
在內的任何字符,請使用象‘[.\n]’
的模式。[...]:
用來表示一組字符,單獨列出:[amk] 匹配 ‘a’,‘m’或’k’\w:
匹配包括下劃線的任何單詞字符。等價於’[A-Za-z0-9_]'。
\W:
匹配任何非單詞字符。等價於‘[^A-Za-z0-9_]’。
\s:
匹配任何空白字符,包括空格、制表符、換頁符等等。等價於[ \f\n\r\t\v]
。\S:
匹配任何非空白字符。等價於[^ \f\n\r\t\v]
。\d:
匹配任意數字,等價於[0-9]
。\D:
匹配一個非數字字符。等價於[^0-9]
。
————
——
——
*
的用法*:
匹配前一個字符出現0次或者無限次,即可有可無
測試例子:
import re
a = re.match("[a-z]*","abcdYFK")
print(a.group())
即匹配任意個小寫字母
——
{m}
和{m,n}
用法{m}:
匹配前一個字符出現m次{m,n}:
匹配前一個字符出現從m到n次
測試例子:
import re
a = re.match("[a-zA-Z0-9_]{5}","abG9j01kl")
b = re.match("[a-zA-Z0-9_]{6,15}","a4BI3d測試g2K")
print(a.group())
print(b.group())
*:
匹配前一個字符出現0次或者無限次,即可有可無+:
匹配前一個字符出現1次或者無限次,即至少有1次?:
匹配前一個字符出現1次或者0次,即要麼有1次,要麼沒有{m}:
匹配前一個字符出現m次{m,n}:
匹配前一個字符出現從m到n次
——
^:
匹配字符串的開頭$:
匹配字符串的末尾。
測試例子:
import re
list = ["abG989","[email protected]","[email protected]","123anasm","@qq.com142"]
for i in list:
a = re.match("^[a-zA-Z_]+[0-9]{3}",i)
if a:
print("匹配結果:"+ a.group() + "————" + i +" 符合a匹配規則的要求")
b = re.match("[\w][email protected]$",i)
if b:
print("匹配結果:"+ b.group() + "————" + i +" 符合b匹配規則的要求")
這裡有a , b兩個匹配要求,
a匹配規則中 ^[a-zA-Z_]+[0-9]{3}
要求開頭是一個以上的字母,再匹配三個數字。
b匹配規則中 [\w][email protected]$
要求必須以@qq.com
結尾,前面匹配一個以上包括下劃線的任何單詞字符。
其中用到了
\w: 匹配包括下劃線的任何單詞字符。等價於’[A-Za-z0-9_]'。
+:匹配前一個字符出現1次或者無限次,即至少有1次
其它的一些運算符:
\A:
匹配字符串開始\z:
匹配字符串結束\Z:
匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串。\G:
匹配最後匹配完成的位置。\b:
匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,‘er\b’
可以匹配"never"
中的‘er’
,但不能匹配“verb”
中的‘er’
。\B:
匹配非單詞邊界。‘er\B’
能匹配“verb”
中的‘er’
,但不能匹配“never”
中的‘er’
。
————
注:
匹配字符的例子先到這裡,不過我還學習到一個問題。
match函數只能從頭開始匹配,不能從中間開始。而當返回值為none時,再次調用group()方法就會出現AttributeError: 'NoneType' object has no attribute 'group'
這類報錯。
——
——
——
掃描整個字符串並返回第一個成功的匹配;匹配成功re.search方法返回一個匹配的對象,否則返回None。
函數語法:re.search(pattern, string, flags=0)
pattern: 匹配的正則表達式
string: 要匹配的字符串。
flags: 標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
前面說到match函數只能從頭開始匹配 ,如果字符串開始不符合正則表達式,則匹配失敗。
而用 re.search 就可以從中間匹配了。
測試例子:
import re
a = re.search("[0-9]{3}","abc123wnf")
print(a.group())
——
在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果有多個匹配模式,則返回元組列表,如果沒有找到匹配的,則返回空列表。
語法和前面的search和match類似。re.findall(pattern, string, flags=0)
重點在可以匹配多個結果。
匹配三個數字,返回一個列表,包含所有符合的匹配結果。
測試例子:
import re
a = re.findall("[0-9]{3}","abc123wn765f32fasg")
print(a)