【JS逆向基础】数据分析之正则表达式
前言:前面介绍了关于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))
未完待续。。。