其实,不从事这份工作,学习起来真的是要吃力很多。花有限的时间学习,平时学习的知识得不到实践运用。只能靠这种方式来记录点点滴滴。希望能够有机会参与到实际工作中。能够在实际工作中得到运用。看了很多外包的任务,都是我胜任不了的,涉及到的知识都还是我现在没有接触到的。不知道哪位能够给点建议,能够从基础活开始做起。进入正题吧,正则表达式感觉还是非常重要的。
1、导入re模块
import re
2、使用match方法进行匹配操作
3、如果上一步匹配到数据的话,可以使用group()方法来提取数据
result = re.match(正则表达式, 要匹配的字符串)
rel = re.match(r"hello", “hello world”)
rel2 = re.match(r"[Hh]ello", “hello world”)
<re.Match object; span=(0, 5), match=‘hello’>
print(rel.group()) 输出匹配结果
re3 = re.match(r"速度与激情[1-9]", “速度与激情5”)
print(re3.group())
# 速度与激情5
[1-9] 匹配1-9的数字
re4 = re.match(r"速度与激情[1-9a-z]", “速度与激情c”)
print(re4.group())
# 速度与激情c
中括号[]里面的数据 只匹配一个数据
re3 = re.match(r"速度与激情[1-9a-z]", “速度与激情5c”)
print(re3.group())
# 速度与激情5
4、匹配单个字符
. 匹配任意1个字符(除了\n)
[] 匹配[]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字
\s 匹配空白,即空格 tab键
\S 匹配非空白
\w 匹配单词字符,即a-z, A-Z, 0-9, _ 和中文字符
\W 匹配非单词字符
5、匹配多个字符
-
匹配前一个字符出现0次或者无限次,即可有可无
-
匹配前一个字符出现1次或者无限次,即至少有一次
? 匹配前一个字符出现1次或者0次,即要么有一次,要么没有
{m} 匹配前一个字符出现m次
{m, n} 匹配前一个字符出现从m到n次
6、
| 匹配左右任意一个表达式
(ab) 将括号中的字符作为一个分组
\num 引用分组num匹配到的字符串 必须和前面相对应位置的元素一样
(?P) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
7、re 模块的高级用法
search 不需要从头开始匹配
findall 返回的是列表,并且不需要用 group 取值
sub 先用正则匹配,匹配到的地方换成中间的值,替换之后,返回整个元素 sub 还可以支持函数的调用
split 根据匹配进行切割字符串,并返回一个列表
re2 = re.match(r"速度与激情\d{1,3}", "速度与激情93")
print(re2.group())
# 速度与激情93
\d{1,3} 匹配1-3位数的数字
re4 = re.match(r"速度与激情\d{3}", "速度与激情938")
print(re4.group())
# 速度与激情938
\d{3} 匹配3位数的数字
re5 = re.match(r"上海的电话号码是:021-?\d{8}", "上海的电话号码是:021-12345678")
print(re5.group())
# 上海的电话号码是:021-12345678
re5 = re.match(r"其他地区的电话号码是:\d{3,4}-?\d{7,8}", "其他地区的电话号码是:0556-4506817")
print(re5.group())
# 其他地区的电话号码是:0556-4506817
re5 = re.match(r"其他地区的电话号码是:\d{3,4}-?\d{7,8}", "其他地区的电话号码是:05564506817")
print(re5.group())
# 其他地区的电话号码是:05564506817
-? 匹配'' - ''有或者没有
re5 = re.match(r"其他地区的电话号码是:\d*", "其他地区的电话号码是:0556-4506817")
print(re5.group())
# 其他地区的电话号码是:0556
re5 = re.match(r"其他地区的电话号码是:\d*", "其他地区的电话号码是:05564506817")
print(re5.group())
# 其他地区的电话号码是:05564506817
html = """ fdsf
dkjkdd
jkjsdjl
sjdljd """
三个双引号 的字符串可以换行打印
print(html)
# fdsf
dkjkdd
jkjsdjl
sjdljd
.* 除了 \n 以为的字符都可以匹配,有或者没有
html = """ fdsf
dkjkdd
jkjsdjl
sjdljd """
re5 = re.match(r".*", html)
print(re5.group())
# fdsf
re.S 让 . 包含 \n 全部匹配上了
re5 = re.match(r".*", html, re.S)
print(re5.group())
# fdsf
dkjkdd
jkjsdjl
sjdljd
match 默认匹配开头,^ 判断开头 $ 判断结尾
def main():
lst = ["age", "_age", "1age", "a_age", "age_1_", "age!", "a#123"]
for name in lst:
ret = re.match(r"[a-zA-Z_][a-zA-Z0-9_]*$", name)
if ret:
print(f"变量名:{name} 符合要求....匹配出来的数据是: {ret.group()}")
else:
print(f"变量名:{name} 不符合要求")
if __name__ == "__main__":
main()
结果:
变量名:age 符合要求…匹配出来的数据是: age
变量名:age 符合要求…匹配出来的数据是: age
变量名:1age 不符合要求
变量名:a_age 符合要求…匹配出来的数据是: a_age
变量名:age_1 符合要求…匹配出来的数据是: age_1
变量名:age! 不符合要求
变量名:a#123 不符合要求
案例: 匹配163的邮箱地址,且@ 符号之前有4-20位
例如 hello@163.com
如果在正则表达式中需要用到了某些普通的字符,比如. ? 等等,仅仅需要
在它们前面添加一个反斜杠 \
def main():
email = input("请输入你的邮箱:")
ret = re.match(r"[a-zA-Z0-9][a-zA-Z0-9_]{4,20}@163\.com$", email)
if ret:
print(f"邮箱: {email} 符合要求....匹配出来的邮箱是: {ret.group()}")
else:
print(f"邮箱:{email} 不符合要求")
if __name__ == "__main__":
main()
分组
() 小括号可以有分组的功能 也可以单独从小括号里面取值
email = "laowang@163.com"
rel = re.match(r"([a-zA-Z0-9][a-zA-Z0-9_]{4,20})@(163|126)\.com$", email)
print(rel.group(1))
# laowang
html_str = "<h1>hhhhaaa</h1>"
rel = re.match(r"<(\w*)>.*</\1>", html_str)
print(rel.group())
# <h1>hhhhaaa</h1>
# \1 表示 第一个分组里面的值是多少 \1的地方就必须是多少
html_str1 = "<body><h1>hhhhaaa</h1></body>"
rel1 = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", html_str1)
print(rel1.group())
# <body><h1>hhhhaaa</h1></body>
# \2 \1 的位置要注意对应
html_str1 = "<body><h1>hhhhaaa</h1></body>"
rel1 = re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>", html_str1)
print(rel1.group())
# <body><h1>hhhhaaa</h1></body>
# 注意 P 要大写才行
ret = re.findall(r"\d+", "read=999, dian=888, zhuanfa=777")
print(ret)
# ['999', '888', '777']
# 返回的是列表,并且不需要用 group 取值
ret = re.search(r"\d+", "阅读次数为999")
print(ret.group())
# 999
# 不需要从头开始匹配
ret = re.sub(r"\d+", "998", "python=997, c++=996")
print(ret)
# python=998, c++=998
# 先用正则匹配,匹配到的地方换成中间的值,替换之后,返回整个元素
# sub 还可以支持函数的调用
ret = re.split(r":| ","info:xiaozhang 33 shandong")
print(ret)
# ['info', 'xiaozhang', '33', 'shandong']
# split 分割,| 后面是空格,相当于就是 在 : 或者空格进行分割
这些东西等到要用的时候直接回来查看一下就可以。感觉还是挺不错的。就当作自己的笔记本用了。