注释是重点!
正则表达式的详细使用
- 注释是重点!
- 正则简介
- re-匹配单个字符
-
- re-匹配多个字符
-
- re-匹配开头和结尾
-
- re-匹配分组
-
- re-其他匹配方法
-
正则简介
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$", "[email protected]").group()
print(r1)
r2 = re.match(r"([a-zA-Z0-9_]{4,20})@(163|126)\.com$", "[email protected]").group(1)
print(r2)
r3 = re.match(r"([a-zA-Z0-9_]{4,20})@(163|126)\.com$", "[email protected]").group(2)
print(r3)
r4 = re.match(r"<(\w*)><(\w*)>.*\2>\1>", "hahahaha
").group()
print(r4)
r5 = re.match(r"<(?P\w*)><(?P\w*)>.*(?P=p2)>(?P=p1)>", "hahahaha
").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))