知识复习:正则表达式

正则表达式是一种强大的文本匹配工具,它用于检索、替换那些符合某种模式(规则)的文本。 基本匹配 文字:最简单的正则表达式是普通的字符,如 a、b、1 等,它们会匹配文本中的相应字符。 特殊字符 .:匹配除换行符以外的任意单个字符。例如,a.b 可以匹配 acb、aab、a2b 等。 ^:匹配行的开头。例如,^a 会匹配以 a 开头的行。 $:匹配行的结尾。例如,a$ 会匹配以 a 结尾的行。 [ ]:匹配方括号内的任意字符。例如,[abc] 会匹配 a、b、或 c。 -:在方括号内使用时,表示字符范围。例如,[a-z] 匹配任何小写字母。 [^ ]:匹配不在方括号内的任意字符。例如,[^abc] 会匹配除 a、b、c 之外的任意字符。 重复 *:匹配前面的字符零次或多次。例如,a* 会匹配 ''、a、aa、aaa 等。 +:匹配前面的字符一次或多次。例如,a+ 会匹配 a、aa、aaa 等,但不会匹配 ''。 ?:匹配前面的字符零次或一次。例如,a? 会匹配 '' 和 a。 {n}:匹配前面的字符恰好 n 次。例如,a{3} 会匹配 aaa。 {n,}:匹配前面的字符至少 n 次。例如,a{2,} 会匹配 aa、aaa 等。 {n,m}:匹配前面的字符至少 n 次,但不超过 m 次。例如,a{2,4} 会匹配 aa、aaa、aaaa。 特殊字符类 \d:匹配任何数字,等价于 [0-9]。 \w:匹配任何字母数字字符,等价于 [a-zA-Z0-9_]。 \s:匹配任何空白字符,包括空格、制表符、换行符等。 分组和引用 ( ):将括号内的表达式定义为“组”(group),并按照顺序编号。可以使用 \数字 引用这些组。 或操作 |:匹配前后任意一个表达式。例如,a|b 会匹配 a 或 b。 实例应用 假设我们想匹配一个简单的日期格式 yyyy-mm-dd:...

March 30, 2024 · 1 min · 90 words · sirius1y

全国大学生市场调研大赛-数据分析

数据的预处理 删除答题时间小于1分钟的 对异常数据进行一些修改 检查有没有重复的问卷 保留研究所需要的列 处理公共题目缺失值 把数据分为总数据df,来过游客的数据df_gone,没有来过游客的数据df_not_gone,所有原始信息保留 对于df_gone和df_not_gone分别应用孤立森林清洗异常问卷 得到最后的数据集df, df_gone, df_not_gone import pandas as pd df = pd.read_csv('乌蒙大草原旅游问卷调查_final.csv') print(df.shape) df.head() 这两段代码主要是排除答题时间小于60s的问卷,不过问卷网上可以直接进行筛选 # 先把答题时间转换为时间格式 def convert_to_seconds(time_str): if '分' in time_str: minutes, seconds = time_str[:-1].split('分') return int(minutes) * 60 + int(seconds) else: return int(time_str[:-1]) df['答题时长'] = df['答题时长'].astype(str) df['答题时长'] = pd.to_timedelta(df['答题时长'].apply(convert_to_seconds), unit='s') # 删除答题时间小于1分钟的数据 df = df[df['答题时长'] > '00:01:00'] print(df.shape) df.head() 针对Q2年龄的一些数据问题进行处理 import seaborn as sns import matplotlib.pyplot as plt # 查看Q2有没有非数字的数据 df['Q2'].unique() # 修改数据 df['Q2'] = df['Q2']....

March 21, 2024 · 27 min · 5544 words · sirius1y

使用LaTex制作中文简历

修改后的效果图 👉项目地址:sirius2alpha/resume 🍴Fork from: hijiangtao/resume LaTex简介 LaTeX是一种基于TeX的排版系统,广泛用于生成科学和数学文档的高质量排版。在LaTeX中,你可以使用各种命令和环境来结构化文档并控制其外观。以下是LaTeX项目的基本结构和语法: LaTeX项目结构 文档类声明(Document Class Declaration) 在文档的最开始,你需要声明文档类,例如\documentclass{article}。这行代码定义了文档的类型和基本布局。 宏包(Packages) 使用\usepackage{}命令来引入宏包。宏包提供了额外的功能,如增强的数学公式支持(amsmath)、图像插入(graphicx)等。 文档设置(Document Settings) 在\begin{document}之前,可以定义一些全局设置,如页面布局、自定义命令等。 正文内容(Document Content) \begin{document}和\end{document}之间的内容是文档的主体。这里包含了所有的文本内容、图表、公式等。 环境(Environments) 在文档中,可以使用各种环境来区分文本的不同部分,例如列表(itemize)、表格(tabular)、数学模式(equation)等。 LaTeX语法 命令(Commands) LaTeX命令以反斜杠\开头,如\textbf{}用于加粗文本。 命令可能需要参数,参数放在花括号{}中;也可能有可选参数,放在方括号[]中。 环境(Environments) 环境用于改变一段文本的行为或布局,格式为\begin{environment} ... \end{environment}。 例如,itemize环境用于创建无序列表。 注释(Comments) 使用百分号%开始注释,注释内容不会出现在最终文档中。 特殊字符(Special Characters) 一些字符在LaTeX中有特殊意义,如%、$、&等,如果需要在文档中直接显示这些字符,通常需要在前面加上反斜杠\。 数学模式(Math Mode) 用$...$来标记行内数学内容,用\[...\]或$$...$$来标记独立的数学块。 通过组合这些结构和语法元素,你可以创建出结构化且格式严谨的文档。LaTeX的学习曲线可能相对陡峭,但它能够为复杂的文档排版提供强大且灵活的功能。 一些修改:修改heading,添加照片布局 在resume.cls文件中新增了一些命令: - \tableInfo:姓名、主页左对齐;电话、邮箱右对齐 - \rightInfo:姓名、主页、电话、邮箱右对齐 - \leftInfo:姓名、主页、电话、邮箱左对齐

March 18, 2024 · 1 min · 48 words · sirius1y

使用Selenium库爬取网易云音乐和携程旅行评论

网络爬虫记录 前置知识 网站的加载形式有两种:静态加载和动态加载 静态加载 在静态加载中,当你访问一个网页时,服务器会发送一个完整的HTML页面。 所有的内容,包括文本、图片和链接,都嵌入在这个HTML文档中。 CSS和JavaScript通常作为外部文件加载,但它们主要用于增强页面的外观和感觉,而不是改变内容。 对爬虫的影响: 易于爬取:静态页面可以直接通过HTTP请求获取,然后使用HTML解析器(如BeautifulSoup)提取所需信息。 无需执行JavaScript:不需要处理JavaScript生成的内容。 动态加载 动态加载的网页通常使用Ajax(Asynchronous JavaScript and XML)或其他JavaScript框架来异步加载数据。 当你访问这样的网页时,初始的HTML文档可能不包含所有内容。随后,JavaScript会被执行来加载更多数据。 这些数据可能来自服务器的额外HTTP请求,通常返回JSON或XML格式的数据。 对爬虫的影响: 更复杂的爬取过程:由于内容是动态加载的,传统的HTTP请求和HTML解析可能无法获取所有数据。 需要模拟浏览器或分析JavaScript:可能需要使用如Selenium之类的工具来模拟浏览器行为,或分析JavaScript代码和网络请求来直接获取数据。 可能涉及到更多的反爬机制:动态加载的网站可能有更复杂的反爬虫策略。 Selenium库 在刷新网易云音乐的一首歌曲下面的评论的时候,发现浏览器的URL都没有发生变化,应该是采用Ajax刷新了网页的部分内容。 对于这样网站的爬虫有两个思路: 在浏览器的控制台上刷新时候查看“网络”部分,分析发送的请求,在相应的进行模拟 使用selenium工具进行模拟 本次任务采用selenium进行模拟进行爬取评论。 然后会得到一堆.txt文件,用python或者shell脚本把他们合在一起,接下来进行数据分析 代码附录 代码1 网易云音乐评论网络爬虫 from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep # 创建ChromeOptions对象并启用无头模式 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') driver = webdriver.Chrome(options=chrome_options) # 打开网站 driver.get('https://music.163.com/#/song?id=1392155391') # 设定起始页号 page_number = 1 # 定位元素框架 comment_frame = driver.switch_to.frame('g_iframe') while page_number<260: # 滚动到页面底部,确保所有的评论都被加载 driver.execute_script("window.scrollTo(0, document....

February 14, 2024 · 2 min · 393 words · sirius1y

点击排行榜scoreboard

项目概述 项目地址:https://github.com/sirius2alpha/scoreboard 使用Redis在服务器上对用户的点击数排序,并返回点击次数排行榜。 技术栈 整体设计 用户界面 排行榜展示区: 显示当前排行榜的状态。 点击按钮: 用户点击来增加他们的计分。 昵称输入和提交: 允许新用户输入昵称并参与排行榜。 实时更新监听: 不需要用户交互,自动更新排行榜。 WebSocket客户端逻辑 建立连接: 当用户访问网站时,建立WebSocket连接。 发送点击事件: 当用户点击按钮时,发送消息到服务器。 接收排行榜更新: 监听来自服务器的排行榜更新,并更新界面。 用户注册: 发送新用户的昵称到服务器。 处理断开连接: 如果用户20秒未操作,发送断开消息到服务器。 后端设计(Gin + Redis) WebSocket服务器 处理WebSocket连接: 接受和管理WebSocket连接。 接收消息: 解析从客户端接收到的消息(点击事件,新用户注册)。 Redis交互: 更新用户的分数并重新排序排行榜。 广播排行榜更新: 将更新后的排行榜发送给所有连接的客户端。 处理断开: 移除30秒未操作的用户。 Redis逻辑 用户分数管理: 存储和更新用户分数。 排行榜排序: 实时更新排行榜。 数据持久化: 保证数据在服务重启后仍然可用。 API设计 本项目API设计采用的是websocket实现。 由于考虑到用户在点击比较频繁,如果采用HTTP会造成头部开销较大,而websocket的头部开销会相对小一些。 消息类型 UserClick: { type: “UserClick”, nickname: “用户昵称” } NewUser: { type: “NewUser”, nickname: “用户昵称” } UserInactive: { type: “UserInactive”, nickname: “用户昵称” }...

January 21, 2024 · 2 min · 287 words · sirius1y