注释是重点!
正则简介
re库又称为正则表达式库,是Python的标准库,主要用于字符串的匹配
re-匹配单个字符
符号 | 作用 |
---|
. | 匹配任意一个字符,除\n |
\d | 匹配数字,即0 - 9 |
\D | 匹配非数字 |
\s | 匹配空白,即 空格,tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z A-Z 0 - 9 _ |
\W | 匹配非单词字符 |
示例代码+详细注释
import re
r1 = re.match(r"速度与激情[1-8]", "速度与激情2")
print(r1.group())
r2 = re.match(r"速度与激情[1-8abcd]", "速度与激情a")
print(r2.group())
r3 = re.match(r"速度与激情[1-8a-zA-Z]", "速度与激情eE")
print(r3.group())
r4 = re.match(r"速度与激情\w", "速度与激情_")
print(r4.group())
r5 = re.match(r"速度与激情\w", "速度与激情哈")
print(r5.group())
r6 = re.match(r"速度与激情\s\d", "速度与激情\t1").group()
print(r6)
r7 = re.match(r"速度与激情........", "速度与激情哈1aA_\t=!")
print(r7.group())
re-匹配多个字符
符号 | 作用 |
---|
* | 匹配前一个字符出现0次或无限次 |
+ | 匹配前一个字符出现一次或者无限次,至少有一次 |
? | 匹配前一个字符出现一次或0次 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
示例代码+详细注释
import re
r1 = re.match(r"速度与激情\d{1,3}", "速度与激情12").group()
print(r1)
r2 = re.match(r"速度与激情\d{1,3}", "速度与激情145").group()
print(r2)
r3 = re.match(r"速度与激情\d{1,3}", "速度与激情8").group()
print(r3)
r4 = re.match(r"\d{11}", "12345678901").group()
print(r4)
r5 = re.match(r"021-?\d{8}", "02112345678").group()
print(r5)
r6 = re.match(r"021-?\d{8}", "021-12345678235").group()
print(r6)
r7 = re.match(r"\d{3,4}-?\d{7,8}", "0123-1234567").group()
print(r7)
print("-----------------------------------------------------------------------")
html_content = """dslfdh
dklgskjdskjg
sgj433
s()+=
sdggs"""
r8 = re.match(r".*", html_content).group()
print(r8)
r8 = re.match(r".*", html_content, re.S).group()
print(r8)
r9 = re.match(r".*", "").group()
print(r9)
re-匹配开头和结尾
示例代码+详细注释
import re
def main():
names = ["age", "_age", "1age", "age_1_", "age!", "a#123", "age1"]
for name in names:
ret = re.match(r"^[a-zA-Z_][a-zA-Z0-9_]*$", name)
if ret:
print("变量名为:%s 符合要求。。。通过正则匹配出来的数据为: %s" % (name, ret.group()))
else:
print("变量名: %s 不符合要求。。。" % name)
if __name__ == "__main__":
main()
re-匹配分组
符号 | 作用 |
---|
(ab) | 将括号中字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?p) | 分组起别名 |
(?P=n) | 引用别名为n分组匹配到的字符串 |
另有一个放在了代码里
示例代码+详细注释
import re
r1 = re.match(r"[a-zA-Z0-9_]{4,20}@(163|126)\.com$", "laowang@126.com").group()
print(r1)
r2 = re.match(r"([a-zA-Z0-9_]{4,20})@(163|126)\.com$", "laowang@126.com").group(1)
print(r2)
r3 = re.match(r"([a-zA-Z0-9_]{4,20})@(163|126)\.com$", "laowang@126.com").group(2)
print(r3)
r4 = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", "<body><h1>hahahaha</h1></body>").group()
print(r4)
r5 = re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>", "<body><h1>hahahaha</h1></body>").group()
print(r5)
re-其他匹配方法
方法 | 说明 |
---|
re.search | 在一个字符串中搜索匹配正则表达式的第一个位置 |
re.match | 匹配相应的字符串 |
re.findall | 搜索字符串,列表形式返回全部匹配到的子串 |
re.split | 将字符串按照正则表达式匹配结果进行分割,返回列表类型 |
re.finditer | 返回一个迭代器,遍历得到结果 |
re.sub | 替换匹配字符 |
示例代码+详细注释
import re
match = re.search(r'[1-9]\d{5}', 'BIT 100081')
print(match)
print(match.group(0))
match1 = re.match(r'[1-9]\d{5}', '100081 BIT')
print(match1.group(0))
ls = re.findall(r'[1-9]\d{5}', 'BIT100081 TSU100084')
print(ls)
sp = re.split(r'[1-9]\d{5}', 'BIT100081 TSU100084 ')
print(sp)
print("??????????????????????????????????????????????????????????????????")
sp1 = re.split(r'[1-9]\d{5}', 'BIT100081 TSU100084', maxsplit=1)
print(sp1)
for m in re.finditer(r'[1-9]\d{5}', 'BIT100081 TUS100084'):
print(m)
print(m.group(0))
su = re.sub(r'[1-9]\d{5}', ':zipcode', 'BIT100081 TSU100081')
print(su)
print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
n = re.search(r'[1-9]\d{5}', 'BIT10081 TSU100084')
print(n.string)
print(n.re)
print(n.pos)
print(n.endpos)
print(n.group(0))
print(n.start())
print(n.end())
print(n.span())
print('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<')
mt = re.search(r'PY.*N', 'PYANBNCNDN')
print(mt.group(0))
ma = re.search(r'PY.*?N', 'PYANBNCNDN')
print(ma.group(0))