前言:前面介紹了關于JS逆向所需的基本知識,比如前端三件套等,從這里開始就要進入到數據分析的范圍內了,當然對于一些小白而言一些基本的知識還是需要知道的,比如正則,XPATNY與BS4;三個內容用三篇博文來詳細介紹一下,與JS開發者共同學習與突破,本篇文章先介紹一下正則表達式。
正則表達式
Regular Expression,譯作正則表達式或正規表示法,表示有規則的表達式,意思是說,描述一段文本排列規則的表達式。正則表達式并不是Python的一部分。而是一套獨立于編程語言,用于處理復雜文本信息的強大的高級文本操作工具。正則表達式擁有自己獨特的規則語法以及一個獨立的正則處理引擎,我們根據正則語法編寫好規則(模式)以后,引擎不僅能夠根據規則進行模糊文本查找,還可以進行模糊分割,替換等復雜的文本操作,能讓開發者隨心所欲地處理文本信息。正則引擎一般由編程語言提供操作,像python就提供了re模塊或regex模塊來調用正則處理引擎。
正則表達式在處理文本的效率上不如系統自帶的字符串操作,但功能卻比系統自帶的要強大許多
最早的正則表達式來源于Per語言,后面其他的編程語言在提供正則表達式操作時基本沿用了Per語言的正則語法,所以我們學習python的正則以后,也可以在java,php,go,javascript,sql等編程語言中使用。
正則對字符串或文本的操作,無非是分割、匹配、查找和替換。
在線測試工具 正則表達式在線測試 - 站長工具
import res = "tools_chaina|||12213132_astrust"ret = re.findall("[a-z]+",s) #其中第一個參數是元字符 共有大概十幾個
print(ret)
1,元字符
元字符是具有特殊含義的字符
下面是一些元字符的使用的方法與代碼實例?
import re"""re.findall(正則模式,文本)基于正則模式查找所有匹配的文本內容"""
#part1:通配符->. 字符集->[]
ret1 = re.findall("a","a,b,c,d,e,a") #
ret2 = re.findall(".","a,b,e,d,e") #通配符ret3 = re.findall("[ace]","a,b,c,d,e") #字符集 其中任何一個字符符合要求就可以ret4 = re.findall("[a-z]","a,b,c,d,e") #a~z的所有字符都匹配出來 合成一個列表ret5 = re.findall("[0-9]","1,2,3,4,5") #0~9的所有字符ret6 = re.findall("\d","1,2,3,4,5,q,d,q") #匹配所有的數字符號ret61 = re.findall("\w","1,2,3,4,5,q,w,d,w,A,S,D") #匹配所有的數字加上字母符號ret7 = re.findall("[0-9a-z]","1,a,2,b,3")ret71 = re.findall("[A-Za-z]","1,a,2,b,3,A,A,S,D,E,F")ret8 = re.findall("[^a-z]","1,a,2,b,3") #匹配一個沒有在中括號出現的任何原子ret9 = re.findall("[^-9,]","1,a,2,b,3")print("ret1:",ret1)print("ret2:",ret2)print("ret3:",ret3)print("ret4:",ret4)print("ret5:",ret5)print("ret6:",ret6)print("ret61:",ret61)print("ret7",ret7)print("ret71:",ret71)print("ret8:",ret8)print("ret9:",ret9)#part2: + 0~多次 * 1~多次 ? [0,1] {} [m,n] 重復ret2 = re.findall("\d+","a,b,234,d,6,888") #默認貪婪匹配ret3 = re.findall("\d+?","a,b,234,d,6,888") #取消貪婪匹配ret4 = re.findall("\d*","a,b,234,d,6,888")ret5 = re.findall("\w+","a,b,234,d,hiydcwhvc,qigeqc")ret6 = re.findall("\w*","a,b,234,d,hiydcwhvc,qigeqc")ret7 = re.findall("123*","a,b,12,d,hiydcwhvc,qigeqc,123")ret8 = re.findall("\w{2,9}","a,b,234,d,hiydcwhvc,qigeqc")ret9 = re.findall("123?","a,b,12,d,hiydcwhvc,qigeqc,123")print(ret9)#part2:位置元字符 ^ 開頭 $ 結尾ret3 = re.findall("^\d+","34,banana,255,orange,65536") #查找第一個數字字符串 沒有就返回空ret4 = re.findall("^\w+","peach,34,banana,255,orange,65536")ret5 = re.findall("\w+$","peach,34,banana,255,orange,65536") #最后一個數字或者字母的字符串print(ret5)# part4:
# | 指定原子或正則模式進行二選一或多選一
# () 具備模式捕獲的能力,也就是優先提取數據的能力,(?:)可以取消模式捕獲ret1 = re.findall(",\w{5},",",apple,banana,peach,orange,melon,") #提取的內容中間包含有兩個逗號ret2 = re.findall(",(\w{5}),",",apple,banana,peach,orange,melon,") #只提取括號中的內容ret3 = re.findall("\w+@\w+\.com","123abc@163.com,....234xyz@qq.com")ret4 = re.findall("(?:\w+)@163\.com","123abe@163.com234xy20gco")
ret5 = re.findall("\w+@(?:qq|163)\.com","123abc@163.com,....234x")print(ret4)#part5: 轉義符 \d \D \w \W \n \s \b \B
#(1)將普通符號轉移成特殊符號
#(2)將特殊符號轉換成普通符號
"""\b 1個單詞邊界原子"""
txt ="my name is nana. nihao,nana"
ret = re.findall(r"na",txt)
ret1 = re.findall(r"\bna", txt)
print(ret)
#正則表達式的進階
text ="<12> <xyz> <!@#$%> <1a!#e2> <>"
ret1 = re.findall("<\d+>",text)
ret2 = re.findall("<\w+>",text)
ret3 = re.findall("<.t>",text)
ret4 = re.findall("<.+?>",text) #增加一個問號就可以將上面的分割取出
ret5 = re.findall("<.*?>",text) #增加一個問號就可以將上面的分割取出
print(ret4)
2,正則表達式的常用接口
2.1 split
def split(patter,string,maxsplit=0,flags=0)
split() #函數返回一個列表,對字符串進行正則分割。
import re
txt:="my name is moluo"
ret = re.split("\s",txt)
print(ret) # 'my', 'name', 'is', 'moluo'
# 可以通過指定 maxsplit 參數來控制分割的次數,例如,僅在第1次出現時才拆分字符串:
import re
txt= "mYname is yuan"
ret = re.split("\s+", txt)
print(ret)
2.2 sub和subn
def sub(pattern,repl,string,count=0,flags=0) 返回匹配后的結果
def subn(pattern,repl,string,count=0,flags=0) 返回匹配后的結果和次數
# sub()函數用選擇的文本替換匹配:
# 找到第一個空白字符并進行替換
import re
txt ="myname is yuan"
ret = re.sub(r"\s+","lei",txt,1)
print(ret)
2.3 search
ret = re.search(r"(?P<tel>1[3-9]\d{9}).*?(?P<email>\d+@qq\.com)","我的手機號碼是13928835900,我的QQ號碼是232324@qq.com")print(ret.group("tel"))print(ret.group("email"))
2.4 match
#(3)match #查找的字符串必須在開頭才可以查到
ret = re.match(r"^1[3-9]\d{9}","13928835900,我的QQ號碼是232324@qq.com")
print(ret)
2.5 complie
1. 預編譯正則表達式模式
re.compile 允許你將一個正則表達式字符串編譯成一個正則表達式模式對象(Pattern object)。這樣做的好處是,如果你需要多次使用同一個正則表達式模式進行匹配,編譯一次后再多次使用可以提高效率。
2. 提高匹配效率
當你需要頻繁使用同一個正則表達式進行匹配時,預編譯可以顯著提高性能。這是因為每次使用正則表達式時,Python 都需要先解析字符串,然后進行匹配。通過預編譯,可以避免重復解析字符串,從而加快匹配速度
#(6)compile 編譯
s1="12 apple 34 peach 77 banana"
ret = re.findall(r"\d+",s1)
print(ret)
s2="22 apple 33 peach 44 banana"
ret = re.findall(r"\d+",s2)
print(ret)reg = re.compile(r"\d+")
print(reg.findall(s1))
未完待續。。。