Python核心模块的高级用法及Linux系统常用命令

news2025/3/13 6:24:17

一、Python相关

1、正则表达式

(1)正则表达式基础

①含义:记录文本规则的代码。

②注意:需要导入re模块

③特点

  • 语法比较复杂,可读性较差。
  • 通用性很强,适用于多种编程语言

④步骤

  1. 导入re模块
  2. 使用match方法进行匹配操作,re.match()能匹配出以xxx开头的字符串,如果起始位置没有匹配成功,返回None
  3. 如果上一步数据匹配成功,使用group()提取数据。
①普通字符

直接匹配字符本身:

  • a 匹配字母 a

  • 5 匹配数字 5

②特殊字符(需转义)

使用 \ 转义特殊字符:

  • \. 匹配 .(如 example.com 中的点)

  • \\ 匹配 \

③字符集合
  • [abc] 匹配 ab 或 c 中的任意一个字符。

  • [a-z] 匹配任意小写字母。

  • [^abc] 匹配 abc 的字符(取反)。

④ 预定义字符类
  • \d 匹配数字(等价于 [0-9])。

  •  \D匹配非数字。

  • \w 匹配字母、数字或下划线(等价于 [a-zA-Z0-9_])。

  •  \W匹配非单词字符。

  • \s 匹配空白字符(空格、制表符、换行等)。

  •  \S匹配非空白。

  • . 匹配任意字符(默认不包括换行符,使用 re.DOTALL 标志可包含)。

示例:

import re

# 匹配单个数字
re.findall(r'\d', "a1b2c3")  # ['1', '2', '3']

# 匹配非字母字符
re.findall(r'[^a-zA-Z]', "a1!b2@")  # ['1', '!', '2', '@']

(2)正则表达式高级用法

匹配多个内容:通过量词控制匹配的次数。

量词:

  • *:0次或多次(贪婪模式)。

  • +:1次或多次。

  • ?:0次或1次。

  •  {m}:匹配前一个字符出现m次。

  • {m,n}匹配前一个字符出现至少 m 次,至多 n 次(如 {3} 表示精确匹配3次)。

①贪婪与非贪婪模式

贪婪模式(默认):.*   (尽可能多匹配)

re.findall(r'a.*b', 'a123b456b')  # ['a123b456b']

非贪婪模式:.*?     (尽可能少匹配)

re.findall(r'a.*?b', 'a123b456b')  # ['a123b', 'a456b']

示例:

# 匹配连续3个数字
re.findall(r'\d{3}', "12345")  # ['123', '45'](第二个匹配不满足3位)

# 匹配1到3个字母
re.findall(r'[a-z]{1,3}', "abc def")  # ['abc', 'def']
import re
text = "<div>content1</div><div>content2</div>"
# 贪婪匹配(匹配整个字符串)
re.findall(r'<div>.*</div>', text)  # ['<div>content1</div><div>content2</div>']
# 非贪婪匹配(匹配单个div标签)
re.findall(r'<div>.*?</div>', text)  # ['<div>content1</div>', '<div>content2</div>']

②匹配开头与结尾
  • ^ 匹配字符串开头(或在多行模式 re.MULTILINE 下匹配行首)。

  • $ 匹配字符串结尾(或在多行模式下匹配行尾)。

  • \A 严格匹配字符串开头。

  • \Z 严格匹配字符串结尾

示例:

# 匹配以 "http" 开头的字符串
re.findall(r'^http', "http://example.com")  # ['http']

# 匹配以 ".com" 结尾的字符串
re.findall(r'\.com$', "example.com")  # ['.com']

# 多行模式匹配每行开头
text = "Line1\nLine2"
re.findall(r'^Line', text, flags=re.MULTILINE)  # ['Line', 'Line']

③分组匹配与反向引用

捕获组 ( )

  • 用 () 包裹内容,捕获匹配的子字符串。

  • 通过 \1\2 反向引用分组(或在替换时使用 $1$2)。

示例:

# 匹配日期格式(年-月-日)
text = "2023-10-05"
match = re.search(r'(\d{4})-(\d{2})-(\d{2})', text)
print(match.groups())  # ('2023', '10', '05')
print(match.group(1))  # '2023'

# 替换日期格式为 "月/日/年"
re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)  # '10/05/2023'

非捕获组 (?: )

  • 仅分组但不捕获(节省内存,提高性能)。
re.findall(r'(?:https?|ftp)://([^/]+)', "http://example.com ftp://test.org")
# 匹配域名:['example.com', 'test.org']

命名分组 (?P<name> )

  • 通过名称引用分组,提高可读性。
match = re.search(r'(?P<year>\d{4})-(?P<month>\d{2})', "2023-10")
print(match.group('year'))   # '2023'
print(match.groupdict())     # {'year': '2023', 'month': '10'}

示例:

# 分组提取
match = re.search(r'(\d{3})-(\d{4})', 'Phone: 123-4567')
print(match.group(1))  # '123'

# 反向引用(匹配重复单词)
re.findall(r'\b(\w+)\b\s+\1', 'hello hello world')  # ['hello']
④预搜索(零宽断言)
# 正向肯定预查(匹配后面是 '@' 的字符)
re.findall(r'\w+(?=@)', 'user@example.com')  # ['user']

(3)综合示例

匹配邮箱
email_pattern = r'^[\w.-]+@[\w-]+(\.[\w-]+)+$'
emails = "user@example.com, invalid@.com"
re.findall(email_pattern, emails, flags=re.MULTILINE)  # ['user@example.com']
匹配重复单词
text = "hello hello world"
re.findall(r'\b(\w+)\b\s+\1', text)  # ['hello'](匹配连续重复的单词)

总结

  • 单个字符:字符集合、预定义字符类。

  • 多个内容:量词控制次数,注意贪婪与非贪婪模式。

  • 开头结尾^ 和 $ 控制边界。

  • 分组匹配:捕获组、非捕获组、命名分组的灵活使用。

2、高级用法

2.1、re.search():扫描整个字符串并返回第一个成功匹配的对象,如果匹配失败,则返回None。

示例:

import re

text = "Order ID: ABC123, Date: 2023-10-05"

# 提取第一个订单ID和日期
match = re.search(r'Order ID: (\w+), Date: (\d{4}-\d{2}-\d{2})', text)
if match:
    print("完整匹配:", match.group(0))  # Order ID: ABC123, Date: 2023-10-05
    print("订单ID:", match.group(1))    # ABC123
    print("日期:", match.group(2))      # 2023-10-05
    print("所有分组:", match.groups())  # ('ABC123', '2023-10-05')

关键方法:

  • group(0):返回完整匹配的字符串。

  • group(n):返回第 n 个分组的匹配内容。

  • groups():返回所有分组的元组。

  • groupdict():返回命名分组的字典(需使用 (?P<name>...) 语法)。

2.2、re.match():仅从字符串开头匹配。

  • 功能:仅在字符串开头检查匹配,若开头不匹配则返回 None

  • 与 re.search() 的区别match() 只在开头匹配,search() 搜索整个字符串。

示例:

text = "2023-10-05 is a date"
match = re.match(r'\d{4}-\d{2}-\d{2}', text)
if match:
    print("匹配到的日期:", match.group())  # 2023-10-05

text2 = "Today is 2023-10-05"
match2 = re.match(r'\d{4}-\d{2}-\d{2}', text2)
print(match2)  # None(因为日期不在开头)

2.3、re.findall():以列表形式返回整个字符串中所有匹配到的字符串。

  • 功能:返回字符串中所有非重叠匹配项的列表(直接返回字符串,而非 Match 对象)。

  • 分组行为:若正则中有分组,返回分组内容的元组列表。

示例:

text = "Emails: user1@example.com, user2@test.org"

# 提取所有邮箱
emails = re.findall(r'\b[\w.-]+@[\w.-]+\.\w+\b', text)
print(emails)  # ['user1@example.com', 'user2@test.org']

# 提取邮箱的用户名和域名(分组)
email_parts = re.findall(r'(\w+)@([\w.-]+\.\w+)', text)
print(email_parts)  # [('user1', 'example.com'), ('user2', 'test.org')]

2.4、re.sub():将匹配到的数据进行替换。

  • 功能:将匹配的内容替换为指定字符串或函数返回值。

  • 分组引用:在替换字符串中使用 \1\2 引用分组。

示例:

text = "2023-10-05 和 2024-12-31"

# 将日期格式从 "年-月-日" 改为 "月/日/年"
new_text = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)
print(new_text)  # 10/05/2023 和 12/31/2024

# 使用函数动态替换(将数字加1)
def increment_year(match):
    year = int(match.group(1)) + 1
    return f"{year}-{match.group(2)}-{match.group(3)}"

new_text = re.sub(r'(\d{4})-(\d{2})-(\d{2})', increment_year, text)
print(new_text)  # 2024-10-05 和 2025-12-31

2.5、re.split():根据匹配进行切割字符串,并返回一个列表。

  • 功能:根据正则表达式分割字符串,返回列表。

  • 保留分隔符:若正则中包含分组,分隔符也会包含在结果中。

示例:

text = "苹果, 香蕉; 西瓜|芒果"

# 按逗号、分号或竖线分割
parts = re.split(r'[,;|]\s*', text)
print(parts)  # ['苹果', '香蕉', '西瓜', '芒果']

# 包含分隔符(使用分组)
parts_with_delim = re.split(r'([,;|])\s*', text)
print(parts_with_delim)  # ['苹果', ',', '香蕉', ';', '西瓜', '|', '芒果']

2.6、re.finditer():返回所有匹配的迭代器。

  • 功能:返回一个迭代器,包含所有匹配的 Match 对象。

  • 优势:适用于处理大文本时节省内存。

示例:

text = "IPs: 192.168.1.1, 10.0.0.1"

# 提取所有IP地址及其各部分
for match in re.finditer(r'(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})', text):
    print("完整IP:", match.group(0))
    print("四个部分:", match.groups())

2.7、re.compile():预编译正则表达式。

  • 功能:将正则表达式编译为 Pattern 对象,提高重复使用时的效率。

  • 优势:适用于多次使用同一正则的场景。

示例:

import re

# 预编译正则表达式
date_pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')

text1 = "日期: 2023-10-05"
text2 = "截止时间: 2024-12-31"

# 复用编译后的正则
match1 = date_pattern.search(text1)
match2 = date_pattern.search(text2)
print(match1.groups())  # ('2023', '10', '05')
print(match2.groups())  # ('2024', '12', '31')

标志参数(Flags)

  • 常用标志

    • re.IGNORECASEre.I):忽略大小写。

    • re.MULTILINEre.M):多行模式(^ 和 $ 匹配每行的开头结尾)。

    • re.DOTALLre.S):. 匹配包括换行符在内的所有字符。

示例:

text = "Hello\nWorld"

# 多行模式匹配行首
matches = re.findall(r'^\w+', text, flags=re.MULTILINE)
print(matches)  # ['Hello', 'World']

# 忽略大小写匹配
match = re.search(r'world', text, flags=re.IGNORECASE)
print(match.group())  # World

总结

  • re.search():查找第一个匹配项,适合提取关键信息。

  • re.findall():快速获取所有匹配的文本列表。

  • re.sub():灵活替换文本内容(支持函数回调)。

  • re.compile():提升性能,代码更简洁。

  • 分组和标志:增强正则表达式的灵活性和精确性。

通过组合这些方法,可以高效处理文本解析、数据清洗、日志分析等复杂任务。

3、常用模块

(1)OS模块

作用:用于和操作系统进行交互

通用操作:

  1. 获取平台信息。
  2. 对目录的操作
  3. 判断操作

os.name:指示正在使用的工作平台(返回操作系统类型:对于Windows,返回nt。对于Linux,返回posix.)

os.getenv(环境变量名称):读取环境变量。

  • os.path.split():把目录名和文件名分离,以元组的形式接收,第一个元素是目录路径,第二个元素是文件名。
  • os.path.dirname:显示split分割的第一个元素,即目录。
  • os.path.basename:显示split分割的第二个元素,即文件名。
  • os.path.isfile:判断是否存在文件。
  • os.path.isdir:判断目录是否存在。
# 导入模块
import os
# 目录操作
os.mkdir("new_dir")        # 创建目录
os.rmdir("new_dir")        # 删除空目录
os.listdir(".")            # 列出当前目录内容
os.rename("old", "new")    # 重命名
os.walk("/path")           # 递归遍历目录

# 路径操作
os.path.join("dir", "file.txt")  # 拼接路径
os.path.abspath("file.txt")      # 绝对路径
os.path.exists("file.txt")       # 检查存在性

(2)sys模块

作用:负责程序跟Python解释器的交互。

  1. sys.getdefaultencoding():获取系统默认编码格式。
  2. sys.path:获取环境变量的路径,跟解释器相关。
  3. sys.platform:获取操作系统平台名称。
  4. sys.version:获取Python解释器的版本信息。
import sys
sys.argv           # 命令行参数列表
sys.exit(0)        # 退出程序
sys.path.append("/custom/module/path")  # 添加模块搜索路径
sys.stdin/sys.stdout/sys.stderr  # 标准输入/输出/错误流

(3)time模块

time.sleep():延时操作,以秒为单位。

import time
time.sleep(2)               # 暂停2秒
current_time = time.time()  # 时间戳(秒)
local_time = time.localtime()  # 结构化时间
formatted = time.strftime("%Y-%m-%d %H:%M:%S", local_time)  # 格式化时间

(4)logging模块

logging.basicConfig()        配置root logger的参数。

filename:指定日志文件的文件名,所有会显示的日志都会存放到这个文件。

filemode:文件的打开方式,默认是a,追加模式。

level:指定日志显示级别,默认是警告信息warning。

format:指定日志信息的输出格式。

import logging
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    filename='app.log'
)
logger = logging.getLogger(__name__)
logger.info("This is an info message")

(5)random模块

作用:用于实现各种分布的伪随机数生成器,可以根据不同的实数分布来随机生成值。

random.random():产生大于0且小于1之间的小数。

random.uniform(a,b):产生指定范围的随机小数。

random.randint(a,b):产生a,b范围内的随机整数,包含开头和结尾。

random.randrange(start,stop,[step]):产生start,stop范围内的整数,包含开头不包含结尾。

import random
random.randint(1, 10)      # 1-10的随机整数
random.choice(["a", "b", "c"])  # 随机选择元素
random.shuffle([1,2,3])    # 打乱列表顺序

二、Linux系统命令

1、虚拟机管理

安装虚拟机工具

# 安装VirtualBox
sudo apt install virtualbox
# 使用Vagrant创建虚拟机
vagrant init ubuntu/focal64 && vagrant up

关机与重启

shutdown -h now      # 立即关机
shutdown -r +5      # 5分钟后重启
reboot              # 立即重启

2、目录操作

cd /path       # 切换目录
ls -l          # 详细列表
mkdir dir      # 创建目录
rmdir dir      # 删除空目录
pwd            # 显示当前路径
tree           # 树形显示目录结构

3、文件操作

touch file.txt    # 创建空文件
cp src.txt dest   # 复制文件
mv old.txt new.txt # 移动/重命名
rm file.txt       # 删除文件(谨慎使用 -r 递归删除)
cat file.txt      # 查看文件内容
head -n 5 file    # 显示前5行
tail -f log.txt   # 实时跟踪日志

4、压缩文件操作

# tar打包
tar -cvf archive.tar dir/     # 创建tar包
tar -xvf archive.tar          # 解压tar包

# gzip压缩
gzip file.txt                # 压缩为.gz
gunzip file.txt.gz           # 解压.gz

# zip压缩
zip -r archive.zip dir/      # 压缩为zip
unzip archive.zip            # 解压zip

5、其他常用命令

# 查找文件
find /path -name "*.txt"    # 按名称查找
grep "pattern" file.txt     # 搜索文本

# 进程管理
ps aux | grep python        # 查看进程
kill -9 PID                 # 强制终止进程

# 网络相关
ping google.com             # 测试网络连通性
ifconfig                    # 查看网络接口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring 框架学习

技术体系结构 总体技术体系 单一架构 一个项目&#xff0c;一个工程&#xff0c;导出为一个 war 包&#xff0c;在一个 Tomcat 上运行&#xff0c;也叫 all in one。 单一架构&#xff0c;项目主要应用技术框架为&#xff1a;Spring、SpringMVC 、Mybatis。 分布式架构 一个…

ubuntu22.04 关于挂在设备为nfts文件格式无法创建软连接的问题

最近遇到情况&#xff0c;解压工程报错&#xff0c;无法创建软连接 但是盘内还有130G空间&#xff0c;明显不是空间问题&#xff0c;查找之后发现是移动硬盘的文件格式是NTFS&#xff0c;在ubuntu上不好兼容&#xff0c;于是报错。 开贴记录解决方案。 1.确定文件格式 使用命…

pydub AudioSegment入门(基于Pyhton3)

目录 简介核心功能安装与依赖基本用法加载音频文件导出音频文件音频基础操作 简介 pydub 是一个简单易用的 Python 音频处理库&#xff0c;专注于提供高层次的音频操作接口&#xff0c;而 AudioSegment 是它的核心类&#xff0c;用于表示音频片段&#xff08;如 MP3、WAV、OGG…

LLM预训练过程-简明版本

文章总结自视频&#xff1a;【1080P】安德烈卡帕西&#xff1a;深入探索像ChatGPT这样的大语言模型&#xff5c;Andrej Karpathy_哔哩哔哩_bilibili 1. 准备训练集 详细的数据集准备方法可参考视频&#xff0c;或者huggingFace ​ 2. 分词&#xff08;Tokenizer&#xff09; …

mingw32编译ffmpeg

ffmpeg https://gitee.com/mirrors/ffmpeg.git 使用msys2的mingw32 pacman -S mingw-w64-x86_64-toolchain compile ./confiure --enable-static --disable-shared --enable-gpl --target-oswin32 mingw32-make -j4 提示编译错误&#xff0c;msys2里面的路径是/d/tools/msys2…

MAVEN解决版本依赖冲突

文章目录 一、依赖冲突概念1、什么是依赖冲突2、依赖冲突的原因3、如何解决依赖冲突 二、查看依赖冲突-maven-helper1、安装2、helper使用1、conflicts的阅读顺序&#xff08;从下向上看&#xff09;2、dependencies as List的阅读顺序&#xff08;从下向上看&#xff09;3、de…

Linux Bash 单命令行解释 | 文件操作 / 字符串操作 / 重定向

注&#xff1a;本文为 “Linux Bash” 相关文章合辑。 中文引文&#xff0c;未整理。 英文引文&#xff0c;机翻未校。 第一部分&#xff1a;文件操作 1. 清空文件&#xff08;清除文件大小为 0&#xff09; $ > file这行命令使用输出重定向操作符 >。输出重定向造成文…

在终端中用code命令打开vscode并加载当前目录了

注册code命令 启动 VSCode 编辑器,按 shift command p输入 shell command&#xff0c;选择 Install ‘code’ command in PATH 选项&#xff0c; 安装code 命令 此操作会把 code 命令添加到系统的环境变量里。 打开 iTerm2 终端 在 iTerm2 中&#xff0c;cd 代码库根目录, …

ESMFold对决AlphaFold:蛋白质-肽相互作用预测的新进展

今天向大家介绍的这篇文章题目为&#xff1a;“Protein−Peptide Docking with ESMFold Language Model”&#xff0c;近期发表在JCTC上。 本文主要研究 ESMFold 语言模型在蛋白质-肽对接中的应用。通过探索多种对接策略&#xff0c;评估其在预测蛋白质-肽相互作用方面的性能&a…

win终端添加git-bash,支持linux的shell语法

git的git-bash支持很多linux的语法&#xff0c;比如ll&#xff0c;rm等等&#xff0c;用着很方便&#xff0c;比cmd、ps用着习惯 点击下箭头&#xff0c;设置 添加新配置 配置 地址为git地址\bin\bash.exe&#xff0c;不要用根目录的git-bash.exe&#xff0c;这个会打开新弹窗后…

wpf中DataGrid组件每一行的背景色动态变化

背景描述&#xff1a;存在多个轧辊&#xff0c;其中有的轧辊是成对的&#xff0c;成对的辊ROLL_NO这个变量的值相同&#xff0c;有的轧辊是单个暂时没有配对的。成对的辊北京颜色交替突出显示&#xff0c;单个辊不需要设置背景色。 实现&#xff1a; 换辊的时候给成对的辊分配相…

002-告别乱码-libiconv-C++开源库108杰

本课文包含三个视频&#xff01; 为什么中文版Windows是编程出现乱码的高发地带&#xff1f;怎么用 libiconv 把国标编码的汉字转换成宇宙统一码&#xff1f;怎么简化 libiconv 那些充满坑的 纯C 函数API&#xff1f; 1. 安装 libiconv 通常&#xff0c;你在 MSYS2 中安装过 G…

DeepSeek赋能智慧交通:城市交通流量智能预测与优化,开启智能出行新时代

在数字化转型的浪潮中&#xff0c;智慧交通正成为提升城市运行效率、改善居民出行体验的关键领域。 DeepSeek作为人工智能领域的前沿技术&#xff0c;凭借其强大的数据分析、智能决策和多模态交互能力&#xff0c;正在为智慧交通注入新的活力&#xff0c;推动交通管理从“经验…

Token登录授权、续期和主动终止的方案(Redis+Token(非jwtToken))

1、RedisToken方案的授权 1.1 基本原理 登录后使用UUID生成token&#xff0c;前端每次请求都会带上这个token作为授权凭证。这种方案是能自动续签&#xff0c;也能做到主动终止。所以很多项目用的都是RedisToken方案&#xff0c;简单方便问题少。缺点就是需要依赖Redis和数据…

强大的数据库DevOps工具:NineData 社区版

本文作者司马辽太杰&#xff0c; gzh&#xff1a;程序猿读历史 在业务快速变化与数据安全日益重要的今天&#xff0c;生产数据库变更管理、版本控制、数据使用是数据库领域的核心挑战之一。传统的解决方式往往采用邮件或即时通讯工具发起审批流程&#xff0c;再通过堡垒机直连数…

【动态规划篇】1137. 第 N 个泰波那契数

前言&#xff1a; 动态规划问题一般分为五步&#xff1a; 先确定一个状态表示根据状态表示来推导状态方程初始化填表顺序返回值 ①状态表示 先创建一个以为数组&#xff0c;起名为dp,这个一维数组就叫做dp表 把dp表填满&#xff0c;填满后的某个值就是我们想要的结果状态表…

网络信息安全专业(710207)网络安全攻防实训室建设方案

一、引言 随着信息技术的飞速发展&#xff0c;网络空间安全已成为国家安全的重要组成部分&#xff0c;对网络信息安全专业人才的需求日益增长。为满足网络信息安全专业&#xff08;专业代码710207&#xff09;的教学需求&#xff0c;提升学生在网络安全攻防领域的实践能力&…

【Linux】:线程池

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来线程池相关的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构…

共享内存(System V)——进程通信

个人主页&#xff1a;敲上瘾-CSDN博客 进程通信&#xff1a; 匿名管道&#xff1a;进程池的制作&#xff08;linux进程间通信&#xff0c;匿名管道... ...&#xff09;-CSDN博客命名管道&#xff1a;命名管道——进程间通信-CSDN博客 目录 一、共享内存的原理 二、信道的建立 …

ctfhub-HTTP协议

请求方式 它要我们使用CTF**B Method,其实就是ctfhub方式 我们直接抓包试一试&#xff0c;把GET改成CTFHUB,在发送到repeater 在repeater处点击发送&#xff0c;得到响应 302跳转 点击“give me flag"没有任何变化&#xff0c;我们抓个包试试 我们把它发送到repeater&…