当前位置: 首页 > news >正文

Python爬虫基础-正则表达式!

在这里插入图片描述

前言

正则表达式是对字符串的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则的字符串”,此字符串用来表示对字符串的一种“过滤”逻辑。正在在很多开发语言中都存在,而非python独有。对其知识点进行总结后,会写一个demo。

1.正则表达式

python是自1.5开始引进re模块进行处理正则的。我先把正则的匹配规则总结一下,再总结re模块相应的方法。

1.1匹配规则

语法解释表达式成功匹配对象
一般字符匹配自身相对应的字符abcabc
.匹配除换行符(\n)以外的任意字符a.cabc
\转义字符,可以改变原字符的意思a.ca.c
\d匹配数字:0~9\dabc1abc
\w匹配单词字符,az;AZ;0~9\w\w\woX2
\s匹配空格字符(\t,\n,\r,\f,\v)a\sca c
\D匹配非数字字符\Dabcaabc
\W匹配非单词字符a\Wca c
\S匹配非空格字符\S\Sc1bc
[]字符集,对应位置上可以是字符集里的任意字符a[def]caec
[^]对字符集当中的内容进行取反a[^def]ca2c
[a-z]指定一个范围字符集a[A-Z]caBc
*允许前一个字符可以出现0次或者无限次a*baaab或b
+前一个字符至少出现1次a+baaab或ab
?前一个字符只能出现一次或者不出现a?bab或b
{m}允许前一个字符只能出现m次a{3}baaab
{m,n}允许前一个字符至少出现m次,最多出现n次(如果不写n,则代表至少出现m次)a{3,5}b和a{3,}aaaab和aaaaaab
^匹配字符串的开始,多行内容时匹配每一行的开始^abcabc
$匹配字符串的结尾,多行内容时匹配每一行的结尾abc&abc
\A匹配字符串开始位置,忽略多行模式\Aabcabc
\Z匹配字符串结束位置,忽略多行模式abc\Zabc
\b匹配位于单词开始或结束位置的空字符串hello \bworldhello world
\B匹配不位于单词开始或结束位置的空字符串he\Bllohello
表示左右表达式任意满足一种即可abc
(…)将被括起来的表达式作为一个分组,可以使用索引单独取出(abc)dabcd
(?P…)为该分组起一个名字,可以用索引或名字去除该分组(?Pabc)dabcd
\number引用索引为number中的内容(abc)d\1abcdabc
(?P=name)引用该name分组中的内容(?Pabc)d(?P=id)abcdabc
(?:…)分组的不捕获模式,计算索引时会跳过这个分组(?:a)b©d\1abcdc
(?iLmsux)分组中可以设置模式,iLmsux之中的每个字符代表一个模式(?i)abcAbc
(?#…)注释,#后面的内容会被忽略ab(?#注释)123ab123
(?=…)顺序肯定环视,表示所在位置右侧能够匹配括号内正则a(?=\d)a1最后的结果得到a
(?!…)顺序否定环视,表示所在位置右侧不能匹配括号内正则a(?!\w)a c最后的结果得到a
(?<=…)逆序肯定环视,表示所在位置左侧能够匹配括号内正则1(?<=\w)a1a
(?<!…)逆序否定环视,表示所在位置左侧不能匹配括号内正则1 (?<!\w)a1 a
(?(id/name)yesno)如果前面的索引为id或者名字为name的分组匹配成功则匹配yes区域的表达式,否则匹配no区域的表达式,no可以省略(\d)(?(1)\d

上面表格中(?iLmsux)这里的”i”, “L”, “m”, “s”, “u”, “x”,它们不匹配任何字串,而对应re模块中(re.S|re.S):

I:re.I# 忽略大小写
L:re.L# 字符集本地化,为了支持多语言版本的字符集使用环境
U :re.U# 使用\\w,\\W,\\b,\\B这些元字符时将按照UNICODE定义的属性
M:re.M # 多行模式,改变 ^ 和 $ 的行为
S:re.S  # '.' 的匹配不受限制,包括换行符
X:re.X # 冗余模式,可以忽略正则表达式中的空白和#号的注释

对于一个特殊字符在正则表达式中是不能正常识别的,如果接触过其他语言我们就这到有一个叫做转移字符的东西的存在,在特殊字符前加用反斜杠接口。比如\n换行\\为反斜杠,在这不再累述。下面来介绍一下re这个模块。

1.2.re模块

此模块主要方法如下

re.match()#尝试从字符串的起始位置匹配一个模式(pattern),如果不是起始位置匹配成功的话,match()就返回None
re.search()#函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
re.findall()#遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。
re.compile()#编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
re.sub()#使用re替换string中每一个匹配的子串后返回替换后的字符串。
re.subn()#返回替换次数
re.split()#按照能够匹配的子串将string分割后返回列表。

1.2.1.re.match()

方法: re.match(pattern, string, flags=0)#pattern:正则表达式(或者正则表达式对象)string:要匹配的字符串flags:修饰符

先看一个最简单的用法

import re
content \='Hello 123 4567 wangyanling REDome'
print(len(content))
result \= re.match('^Hello\\s\\d\\d\\d\\s\\d{4}\\s\\w{10}.\*Dome$', content)
print(result)
print(result.group())
print(result.span())

结果:

匹配规则就不在累述,以上需要注意的是

(1)**.group()**表示的是返回正则匹配的结果

(2)**.span()**表示返回正则匹配的范围

使用:

以上我们已经知道re.matcha()的具体方法,那么接下我来看一下具体使用,对此我们要理解以下几种匹配的感念。

1.泛匹配(.*):匹配所有字符

import re
content \='Hello 123 4567 wangyanling REDome'
result \= re.match('^Hello.\*Dome$', content)
print(result)
print(result.group())
print(result.span())

它的结果是和上面的输出结果完全一样的。

2.目标匹配(()):将需要的字符匹配出来

import re
content \='Hello 123 4567 wangyanling REDome'
result \= re.match('^Hello\\s\\d\\d(\\d)\\s\\d{4}\\s\\w{10}.\*Dome$', content)
print(result)
print(result.group(1))
import re
content \='Hello 123 4567 wangyanling REDome'
result \= re.match('^Hello\\s(\\d+)\\s\\d{4}\\s\\w{10}.\*Dome$', content)
print(result)
print(result.group(1))

结果

以上可以看出:

(1)_()_匹配括号内的表达式,也表示一个组
(2)+ 匹配1个或多个的表达式
* 匹配0个或多个的表达式
(3).group(1)—输出第一个带有()的目标

3.贪婪匹配(.*()):匹配尽可能少的的结果

import re
content \='Hello 123 4567 wangyanling REDome'
result \= re.match('^H.\*(\\d+).\*Dome$', content)
print(result)
print(result.group(1))

结果

 **4.贪婪匹配(.\*?()):匹配尽可能多的结果**
import re
content \='Hello 123 4567 wangyanling REDome'
result \= re.match('^H.\*?(\\d+).\*?Dome$', content)
print(result)
print(result.group(1))

结果

以上3,4两个匹配方式请尽量采用非贪婪匹配

**5.其他**

换行:

import re
content \='''Hello 123 4567 wangyanling REDome'''result \= re.match('^H.\*?(\\d+).\*?Dome$', content,re.S)#re.S
print(result.group(1))
result \= re.match('^H.\*?(\\d+).\*?Dome$', content)
print(result.group(1))

结果:

转义字符:

import re
content \= 'price is $5.00'
result \= re.match('price is $5.00', content)
print(result)
result \= re.match('price is \\$5\\.00', content)
print(result)

结果:

其中re.I使匹配对大小不敏感,re.S匹配包括换行符在内的所有字符,\进行处理转义字符。匹配规则中有详细介绍。

1.2.2.re.search()

方法:

re.search(pattern, string, flags=0)#pattern:正则表达式(或者正则表达式对象)string:要匹配的字符串flags:修饰符#re.match()和re.search()用法类似唯一的区别在于re.match()从字符串头开始匹配,若头匹配不成功,则返回None    

对比一下与match()

import re
content \='Hello 123 4567 wangyanling REDome'
result \= re.match('(\\d+)\\s\\d{4}\\s\\w{10}.\*Dome$', content)
print(result)#从开头开始查找,不能匹配返回None
result = re.search('(\\d+)\\s\\d{4}\\s\\w{10}.\*Dome$', content)
print(result)
print(result.group())

结果:

可以看出两个使用基本一致,search从头开始匹配,如果匹配不到就返回none.

1.2.3.re.findall()

方法: re.finditer(pattern, string, flags=0)#pattern:正则表达式(或者正则表达式对象)string:要匹配的字符串flags:修饰符

与re.search()类似区别在于re.findall()搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。

import rehtml \= '''<div><li><a href="" singer="鲁迅"\>呐喊</a></li><li><a href="#" singer="贾平凹"\>废都</a></li><li class\="active"\><a href="#" singer="路遥"\>平凡世界</a></li><span class\="rightSpan"\>谢谢支持</span></div>
'''
regex\_4='<a.\*?>(.\*?)</a>'
results\=re.findall(regex\_4,html,re.S)
print(results)
for result in results:print(result)

结果:

1.2.4.re.compile()

编译正则表达式模式,返回一个对象的模式。

方法: re.compile(pattern,flags=0)#pattern:正则表达式(或者正则表达式对象);flags:修饰符

看一个demo

import re
content \='Hello 123 4567 wangyanling REDome wangyanling 那小子很帅'
rr \= re.compile(r'\\w\*wang\\w\*')
result \=rr.findall(content)
print(result)

结果:

我们可以看出compile 我们可以把它理解为封装了一个公用的正则,类似于方法,然后功用。

1.2.5.其他

re.sub 替换字符

方法: re.sub(pattern, repl, string, count=0, flags=0)#pattern:正则表达式(或者正则表达式对象)repl:替换的字符串string:要匹配的字符串count:要替换的个数flags:修饰符

re.subn 替换次数

方法: re.subn(pattern, repl, string, count=0, flags=0)#pattern:正则表达式(或者正则表达式对象)repl:替换的字符串string:要匹配的字符串count:要替换的个数flags:修饰符

re.split()分隔字符

方法

re.split(pattern, string,\[maxsplit\])#正则表达式(或者正则表达式对象)string:要匹配的字符串;maxsplit:用于指定最大分割次数,不指定将全部分割

2.案例:爬取猫眼信息,写入txt,csv,下载图片

2.1.获取单页面信息

def get\_one\_page(html):pattern\= re.compile('<dd>.\*?board-index.\*?>(\\d+)</i>.\*?data-src="(.\*?)".\*?name"><a.\*?>(.\*?)</a>.\*?star">(.\*?)</p>.\*?releasetime'+ '.\*?>(.\*?)</p>.\*?score.\*?integer">(.\*?)</i>.\*?>(.\*?)</i>.\*?</dd>',re.S)#这里就用到了我们上述提到的一些知识点,非贪婪匹配,对象匹配,修饰符items = re.findall(pattern,html)for item in  items:yield {'rank' :item\[0\],'img':  item\[1\],'title':item\[2\],'actor':item\[3\].strip()\[3:\] if len(item\[3\])>3 else '',  'time' :item\[4\].strip()\[5:\] if len(item\[4\])>5 else '','score':item\[5\] + item\[6\]}

对于上面的信息我们可以看出是存到一个对象中那么接下来我们应该把它们存到文件当中去。

2.2.保存文件

我写了两种方式保存到txt和csv这些在python都有涉及,不懂得可以去翻看一下。

2.2.1.保存到txt

def write\_txtfile(content):with open("Maoyan.txt",'a',encoding='utf-8') as f:#要引入json,利用json.dumps()方法将字典序列化,存入中文要把ensure\_ascii编码方式关掉f.write(json.dumps(content,ensure\_ascii=False) + "\\n")f.close()

结果:

以上看到并非按顺序排列因为我用的是多线程。

2.2.2.保存到csv

def write\_csvRows(content,fieldnames):'''写入csv文件内容'''with open("Maoyao.csv",'a',encoding='gb18030',newline='') as f:#将字段名传给Dictwriter来初始化一个字典写入对象writer = csv.DictWriter(f,fieldnames=fieldnames)#调用writeheader方法写入字段名writer.writerows(content)f.close()

结果:

那么还有一部就是我们要把图片下载下来。

2.2.3.下载图片

def download\_img(title,url):r\=requests.get(url)with open(title+".jpg",'wb') as f:f.write(r.content)

2.3.整体代码

这里面又到了多线程在这不在叙述后面会有相关介绍。这个demo仅做一案例,主要是对正则能有个认知。上面写的知识点有不足的地方望大家多多指教。

#抓取猫眼电影TOP100榜
from multiprocessing import Pool
from requests.exceptions import RequestException
import requests
import json
import time
import csv
import re
def get\_one\_page(url):'''获取单页源码'''try:headers \= {"User-Agent":"Mozilla/5.0(WindowsNT6.3;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/68.0.3440.106Safari/537.36"}res \= requests.get(url, headers=headers)# 判断响应是否成功,若成功打印响应内容,否则返回Noneif res.status\_code == 200:return res.textreturn Noneexcept RequestException:return None
def parse\_one\_page(html):'''解析单页源码'''pattern \= re.compile('<dd>.\*?board-index.\*?>(\\d+)</i>.\*?data-src="(.\*?)".\*?name"><a.\*?>(.\*?)</a>.\*?star">(.\*?)</p>.\*?releasetime'+ '.\*?>(.\*?)</p>.\*?score.\*?integer">(.\*?)</i>.\*?>(.\*?)</i>.\*?</dd>',re.S)items \= re.findall(pattern,html)#采用遍历的方式提取信息for item in  items:yield {'rank' :item\[0\],'img':  item\[1\],'title':item\[2\],'actor':item\[3\].strip()\[3:\] if len(item\[3\])>3 else '',  #判断是否大于3个字符'time' :item\[4\].strip()\[5:\] if len(item\[4\])>5 else '','score':item\[5\] + item\[6\]}def write\_txtfile(content):with open("Maoyan.txt",'a',encoding='utf-8') as f:#要引入json,利用json.dumps()方法将字典序列化,存入中文要把ensure\_ascii编码方式关掉f.write(json.dumps(content,ensure\_ascii=False) + "\\n")f.close()
def write\_csvRows(content,fieldnames):'''写入csv文件内容'''with open("Maoyao.csv",'a',encoding='gb18030',newline='') as f:#将字段名传给Dictwriter来初始化一个字典写入对象writer = csv.DictWriter(f,fieldnames=fieldnames)#调用writeheader方法写入字段名#writer.writeheader()            ###这里写入字段的话会造成在抓取多个时重复.writer.writerows(content)f.close()
def download\_img(title,url):r\=requests.get(url)with open(title+".jpg",'wb') as f:f.write(r.content)
def main(offset):fieldnames \= \["rank","img", "title", "actor", "time", "score"\]url \= "http://maoyan.com/board/4?offset={0}".format(offset)html \= get\_one\_page(url)rows \= \[\]for item in parse\_one\_page(html):#download\_img(item\['rank'\]+item\['title'\],item\['img'\])write\_txtfile(item)rows.append(item)write\_csvRows(rows,fieldnames)if \_\_name\_\_ == '\_\_main\_\_':pool \= Pool()#map方法会把每个元素当做函数的参数,创建一个个进程,在进程池中运行.pool.map(main,\[i\*10 for i in range(10)\])

如果你是准备学习Python或者正在学习(想通过Python兼职),下面这些你应该能用得上: 包括:Python安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!在这里插入图片描述

相关文章:

Python爬虫基础-正则表达式!

前言 正则表达式是对字符串的一种逻辑公式&#xff0c;用事先定义好的一些特定字符、及这些特定字符的组合&#xff0c;组成一个“规则的字符串”&#xff0c;此字符串用来表示对字符串的一种“过滤”逻辑。正在在很多开发语言中都存在&#xff0c;而非python独有。对其知识点…...

Python处理PDF组件使用及注意事项

在 Python 中处理 PDF 文件时&#xff0c; 使用的组件及注意事项如下&#xff1a; 1. PyPDF2 / PyPDF4 说明&#xff1a; PyPDF2 和 PyPDF4 都是功能强大的 PDF 操作库&#xff0c;适用于合并、拆分、旋转 PDF 文件&#xff0c;提取 PDF 元数据等。PyPDF4 是 PyPDF2 的一个分…...

langgraph_plan_and_execute

整体入门demo 教程概览 欢迎来到LangGraph教程&#xff01; 这些笔记本通过构建各种语言代理和应用程序&#xff0c;介绍了如何使用LangGraph。 快速入门&#xff08;Quick Start&#xff09; 快速入门部分通过一个全面的入门教程&#xff0c;帮助您从零开始构建一个代理&a…...

[代码随想录打卡Day8] 344.反转字符串 541. 反转字符串II 54. 替换数字

反转字符串 难度&#xff1a;易。 问题描述&#xff1a;编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 这个就是开头…...

DCN DCWS-6028神州数码 AC 设备配置笔记

DCN DCWS-6028神州数码 AC 设备配置笔记 一、前期准备 PC 电脑网络配置 目的:使 PC 能够访问 AC 的 web 管理控制台。配置详情:web 管理控制台地址为 192.168.1.10,将 PC 电脑 IP 地址配置在 192.168.1.1 - 192.168.1.254 网段内,如 192.168.1.110,子网掩码 255.255.255.…...

Go语言的常用内置函数

文章目录 一、Strings包字符串处理包定义Strings包的基本用法Strconv包中常用函数 二、Time包三、Math包math包概述使用math包 四、随机数包&#xff08;rand&#xff09; 一、Strings包 字符串处理包定义 Strings包简介&#xff1a; 一般编程语言包含的字符串处理库功能区别…...

华为OD技术一面手撕题

150. 逆波兰表达式求值 来自leecode 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&#xff09;都…...

Qt低版本多网卡组播bug

原文地址 最近在某个项目中&#xff0c;发现了一个低版本Qt的bug&#xff0c;导致组播无法正常使用&#xff0c;经过一番排查&#xff0c;终于找到了原因&#xff0c;特此记录。 环境 Qt&#xff1a;5.7.0 mingw32操作系统&#xff1a;windows 11 现象 在Qt5.7.0版本中&…...

Leetcode:540. 有序数组中的单一元素

题目 给你一个仅由整数组成的有序数组&#xff0c;其中每个元素都会出现两次&#xff0c;唯有一个数只会出现一次。 请你找出并返回只出现一次的那个数。 你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。 输入: nums [1,1,2,3,3,4,4,8,8] 输出: 2 输入:…...

Python数据分析NumPy和pandas(二十七、数据可视化 matplotlib API 入门)

数据可视化或者数据绘图是数据分析中最重要的任务之一&#xff0c;是数据探索过程的一部分&#xff0c;数据可视化可以帮助我们识别异常值、识别出需要的数据转换以及为模型生成提供思考依据。对于Web开发人员&#xff0c;构建基于Web的数据可视化显示也是一种重要的方式。Pyth…...

数组指针和指针的区别

区分数组指针和指针数组 int *p[3]和 int (*p)[3] 根据运算符的优先级&#xff0c;"[]"的优先级是高于“*”的&#xff0c;p就会先与[]结合&#xff0c;那么它本质就是数组&#xff0c;数组内存放的是指针&#xff0c;它叫指针数组。&#xff08;int*p[3]&#xff…...

Linux git-bash配置

参考资料 命令提示符Windows下的Git Bash配置&#xff0c;提升你的终端操作体验WindowsTerminal添加git-bash 目录 一. git-bash配置1.1 解决中文乱码1.2 修改命令提示符 二. WindowsTerminal配置git-bash2.1 添加git-bash到WindowsTerminal2.2 解决删除时窗口闪烁问题 三. VS…...

【后端速成Vue】computed计算属性

前言&#xff1a; 本期将会介绍 Vue 中的计算属性&#xff0c;他和 methods 方法又会有什么区别呢&#xff1f;在这里都会给你一一讲解。 篮球哥找工作专属IT岗位内部推荐&#xff1a; 专属内推链接&#xff1a;内推通道 1、computed计算属性 概念&#xff1a; 基于现有的数据…...

力扣-每日温度

. - 力扣&#xff08;LeetCode&#xff09; 这是我的第一个思路 虽然可以得到正确答案 但是过于暴力 已经超出了时间限制 class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {vector<int>ans;for (int i 0; i <…...

(Go语言)初上手Go?本篇文章帮拿捏Go的数据类型!

1. bool 类型 布尔类型&#xff1a;只有 true 和 false 两种值 在Go中&#xff0c;整数 0 不代表 false 值&#xff0c;1也不代表 true 值 即数字无法代替布尔值进行逻辑判断&#xff0c;两者是完全不同的类型 布尔类型占用 1 字节 2. int 整型 Go中为不同位数的整数分配…...

支付宝域名如何加入白名单(扫码老是弹窗)

支付宝扫码之后,遇到非支付宝官方网页,请确认是否继续访问弹窗,问题解决办法。 本章教程提供解决办法,亲测有效。 一、打开支付宝开放平台 登录地址:https://open.alipay.com/ 然后进行扫码登录。 1、打开网页/移动应用开发 2、前往创建 3、创建应用...

嵌入式学习第21天Linux基础

目录 第1章 Linux 系统介绍 1.1 Unix 操作系统&#xff08;了解&#xff09; 1.2 Linux 操作系统&#xff08;了解&#xff09; 1.3 Linux 操作系统的主要特性&#xff08;重点&#xff09; 1.4 Linux 与 Unix 的区别与联系 1.5 GUN 与 GPL&#xff08;了解&#xff09; …...

【activiti工作流源码集成】springboot+activiti+mysql+vue+redis工作流审批流集成整合业务绑定表单流程图会签驳回

工作流集成实际项目案例&#xff0c;demo提供 源码获取方式&#xff1a;本文末个人名片直接获取。 前言 activiti工作流引擎项目&#xff0c;企业erp、oa、hr、crm等企事业办公系统轻松落地&#xff0c;请假审批demo从流程绘制到审批结束实例。 一、项目形式 springbootvue…...

华为私有接口类型hybrid

华为私有接口类型hybrid Tip&#xff1a;hybrid类型&#xff0c;简称混合型接口。 本次实验模拟2层网络下 vlan10 vlan20 不能互访&#xff0c;vlan10 vlan20 同时可以访问vlan100 sw1配置如下&#xff1a; <Huawei>sy [Huawei]sys sw1 [sw1]vl ba 10 20 100 [sw1]int…...

计算机的错误计算(一百五十)

摘要 探讨 MATLAB 中 的计算精度问题。当 为含有小数的大数或 &#xff08;&#xff09;附近数时&#xff0c;输出会有错误数字。 例1. 已知 计算 直接贴图吧&#xff1a; 另外&#xff0c;16位的正确值分别为 -0.7882256119904400e0、0.1702266977524110e0、-0.…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...