首页 > 其他分享 >17 模块subprocess、re

17 模块subprocess、re

时间:2024-08-06 23:28:50浏览次数:8  
标签:球王 字符 匹配 17 subprocess re print findall

1. subprocess模块

1.1 概念

 subprocess模块启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值

简单理解:可以远程连接电脑(socket模块)

1.2 Popen方法

import subprocess

res = subprocess.Popen(['help', 'ver'],  # windows中执行的命令要放在列表里面,命令单词之间用逗号隔开
                       shell=True,  # Windows和Linux都填写True
                       stdout=subprocess.PIPE,  # 存储正确结果的返回值
                       stderr=subprocess.PIPE)  # 存储错误结果的返回值
print(res)  # <Popen: returncode: None args: ['help']>
print(res.stdout)  # <_io.BufferedReader name=3>
print(res.stdout.read().decode('gbk'))  # Linux默认编码格式是utf-8,国内Windows默认编码格式是gbk

 subprocess模块首先推荐的是run方法,更高级的方法使用Popen接口

1.3 run方法

# run参数的含义
# *popenargs:解包,将命令单词用逗号隔开放列表里  ['cd', '目录']
# timeout:超时时间,执行某个命令,在指定时间内没有执行成功就返回错误信息
# check:如果该参数设置为True,并且进程退出状态码不是0,则弹出CalledProcessError 异常。
# stdout:存储正确结果的管道
# stderr:存储错误结果的管道
# shell:Windows和Linux都填True
# encoding:如果指定了该参数,则 stdin、stdout 和 stderr 可以接收字符串数据,并以该编码方式编码,否则只接收 bytes 类型的数据。
import subprocess

res = subprocess.run(
    ["cd .."],  # 格式一定为列表形式
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    encoding='gbk'
    # 如果这里是True就不需要执行上面的stdout和stderr,错误的情况下正常打印错误信息
    # 如果这里是False程序就会直接报错
    # capture_output=True

)
print(res.stderr)

 1.4 call方法

import os
import subprocess

root_dir = os.path.dirname(os.path.dirname(__file__))
print(root_dir)
subprocess.call('help')  # 可以执行简单的命令,不能执行下方复杂的命令
subprocess.call(['dir', 'D:\project\pythonProject'])
subprocess.call(['dir', 'D:\\project\\pythonProject'])

2. 正则表达式re模块

2.1 概念

正则表达式的主要作用是用于检索、‌替换那些符合某个特定模式的文本。‌它通过使用特定的字符和字符组合来形成一个“规则字符串”,‌这个“规则字符串”用来表达对字符串的过滤逻辑,‌从而实现对文本的模式匹配和操作。‌

2.2 引入

# 校验手机号是否符合规范
def check_pn(pn):
    if not pn.isdigit():
        return '必须是数字'
    if len(pn) != 11:
        return '必须11位'
    if pn[0:2] not in ['13', '14', '15', '16', '17', '18', '19']:
        return '号段错误'
    return f'号码:{pn}格式正确'

while True:
    num = input('请输入手机号:')
    print(check_pn(num))

正则表达式进行格式匹配

import re

def check_pn(pn):
    # ^1是否以1开头,接下来的1位是否位3~9,结尾是否为数字,结尾位数是否为9位
    pattern = '^1[3456789]\d{9}$'
    if not re.match(pattern, pn):
        return '格式不正确'
    return f'手机号:{pn}格式正确'

while True:
    num = input('请输入手机号:')
    print(check_pn(num))

2.3 字符组

概念:在同一个位置可能出现的各种字符组成了一个字符组
语法:[       ]
字符分为很多类,比如数字、字母、标点等等。
假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。

正则

待匹配字符

匹配结果

说明

[0123456789]

8

True

在一个字符组里枚举合法的所有字符,字符组里的任意一个字符和"待匹配字符"相同都视为可以匹配

[0123456789]

a

False

由于字符组中没有"a"字符,所以不能匹配

[0-9]

7

True

也可以用-表示范围,[0-9]就和[0123456789]是一个意思

[a-z]

s

True

同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示

[A-Z]

B

True

[A-Z]就表示所有的大写字母

[0-9a-fA-F]

e

True

可以匹配数字,大小写形式的a~f,用来验证十六进制字符

# findall方法:在指定文本中查找符合正则表达式的内容
import re

a = '789'
pattern1 = '[1]'  # pattern1 = ['1']这样写会报错
# 去a中查找符合pattern1的内容,有则返回,没有则返回空
print(re.findall(pattern1, a))  # []

b = '123'
pattern2 = '[1]'
print(re.findall(pattern2, b))  # ['1']

c = '666'
pattern3 = '[0-9]'  # 匹配0~9的数字
pattern4 = '[0123456789]'
print(re.findall(pattern3, c))  # ['6', '6', '6']
print(re.findall(pattern4, c))  # ['6', '6', '6']

d = '123abcABC'
pattern5 = '[a-z]'  # 匹配所有小写字母
print(re.findall(pattern5, d))  # ['a', 'b', 'c']

e = '123abcABC'
pattern6 = '[A-Z]'  # 匹配所有大写字母
print(re.findall(pattern6, e))  # ['A', 'B', 'C']

f = '123abcABC'  
pattern7 = '[0-9a-zA-Z]'  # 匹配大小写字母、数字
print(re.findall(pattern7, f))  # ['1', '2', '3', 'a', 'b', 'c', 'A', 'B', 'C']

2.4 字符组案例

# [  ]匹配字符组中的任意一个字符
# [^ ]匹配除了字符组外的任意一个字符
# ^[ ]匹配以字符组中的任意一个字符开头

import re

a = '球王和球玉和球土和球欧冠和球'
pattern1 = '球[王和球玉和球土和球欧冠和球]'
print(re.findall(pattern1, a))  # ['球王', '球玉', '球土', '球欧']

b = '球王和球玉和球土和球欧冠和球'
pattern2 = '球[王和玉和土和欧冠和]*'  # *匹配0次或无数次
print(re.findall(pattern2, b))  # ['球王和', '球玉和', '球土和', '球欧冠和', '球']

c = '球王和球玉和球土和球欧冠和球'
pattern3 = '球[^和]'
print(re.findall(pattern3, c))  # ['球王', '球玉', '球土', '球欧']

d = '11aa22bb33'
pattern4 = '\d+'  # 匹配数字1次或多次
print(re.findall(pattern4, d))  # ['11', '22', '33']

2.5 元字符

元字符    匹配内容
.    匹配除换行符以外的任意字符
\w    匹配字母或数字或下划线
\s    匹配任意的空白符
\d    匹配数字
\n    匹配换行符
\t    匹配制表符 是1个tab键,相当于4个空格
\b    匹配单词的结尾
^    匹配字符串的开始
$    匹配字符串的结尾
\W    匹配非字母或数字或下划线
\D    匹配非数字
\S    匹配非空白符
a|b    匹配字符a或字符b
()    匹配括号内的表达式,也表示一个组
[...]    匹配字符组中的字符
[^...]    匹配除了字符组中字符的所有字符
import re

a = '12 \n ab'
pattern1 = '.'  # 匹配换行符外的所有字符
print(re.findall(pattern1, a))
# ['1', '2', ' ', ' ', 'a', 'b']  空格也能匹配

b = '12_ \n ab_%&*'
pattern2 = '\w'  # 匹配字母、数字、下划线
print(re.findall(pattern2, b))  # ['1', '2', '_', 'a', 'b', '_']

c = '12_ \n ab_%&*'
pattern3 = '\s'  # 匹配任意的空白符
print(re.findall(pattern3, c))  # [' ', '\n', ' ']

d = '12_ \n ab_%&*'
pattern4 = '\d'  # 匹配数字
print(re.findall(pattern4, d))  # ['1', '2']

e = '12_ \n\n \nab_%&*'
pattern5 = '\n'  # 匹配换行符
print(re.findall(pattern5, e))  # ['\n', '\n', '\n']

f = '12_ \n\t ab_%&*\t'
pattern6 = '\t'  # 匹配制表符(制表符是一个tab键,相当于4个空格)
print(re.findall(pattern6, f))  # ['\t', '\t']

g = 'hello hi how'
pattern7 = "'[how]'\b"  # ???匹配单词的结尾
print(re.findall(pattern7, g))  # []

h = '123abc'
pattern8 = '^[0-9]'  # 匹配字符串的开始
print(re.findall(pattern8, h))  # ['1']
pattern9 = '^[a-z]'
print(re.findall(pattern9, h))  # []

i = '12_ \n ab_%&@'
pattern10 = '[0-9]$'  # 匹配字符串的结尾
print(re.findall(pattern10, i))  # []
pattern11 = '@$'
print(re.findall(pattern11, i))  # ['@']

j = '12_ \n ab_%&*'
pattern12 = '\W'  # 匹配非数字、字母、下划线
print(re.findall(pattern12, j))  # [' ', '\n', ' ', '%', '&', '*']

k = '12_ \n ab_%&*'
pattern13 = '\D'  # 匹配非数字
print(re.findall(pattern13, k))  # ['_', ' ', '\n', ' ', 'a', 'b', '_', '%', '&', '*']

l = '12_ \n\t ab_%&*\t'
pattern14 = '\S'  # 匹配非空白符
print(re.findall(pattern14, l))  # ['1', '2', '_', 'a', 'b', '_', '%', '&', '*']

m = '12_ \n\t ab_%&*\t'
pattern15 = '[0-9]|[a-z]'  # a|b,匹配字符a或字符b
print(re.findall(pattern15, m))  # ['1', '2', 'a', 'b']

n = '123456789 \n abcd'
pattern16 = '12([0-9])4'  # ()  匹配括号内的表达式,也表示一个组
print(re.findall(pattern16, n))  # ['3']

o = '123456789 \n abcd'
pattern17 = '23[0-9][0-9]678'  # [...]匹配字符组中的字符
print(re.findall(pattern17, o))  # ['2345678']
pattern18 = '23([0-9][0-9])678'
print(re.findall(pattern18, o))  # ['45']

p = '123456789 \n abcd'
pattern19 = '[^0-9]'  # 匹配除了字符组中字符的所有字符
print(re.findall(pattern19, p))  # [' ', '\n', ' ', 'a', 'b', 'c', 'd']

2.6 位置元字符案例

import re

# . 表示任意一个字符
a = '球王球玉球土球欧冠'
pattern1 = '球.'
print(re.findall(pattern1, a))  # ['球王', '球玉', '球土', '球欧']

# ^ 以某个字符开头
b = '球王球玉球土球欧冠'
pattern2 = '^球.'
print(re.findall(pattern2, b))  # ['球王']

# $ 以某个字符结尾
c = '球王球玉球土球欧冠'
pattern3 = '球.$'
print(re.findall(pattern3, c))  # []
pattern4 = '球..$'
print(re.findall(pattern4, c))  # ['球欧冠']

# ^以某个字符开头  \w匹配字母、数字、下划线   {5}重复5次
d = 'city_haaland'
pattern5 = "^\w{5}"
print(re.findall(pattern5, d))  # ['city_']

# \w匹配字母、数字、下划线   {5}重复5次   $以某个字符结尾
e = 'leo_messi'
pattern6 = "\w{5}$"
print(re.findall(pattern6, e))  # ['messi']

# ^以某个字符开头  \w匹配字母、数字、下划线   {5}重复5次  $以某个字符结尾
f = 'leo_messi'
pattern7 = "^\w{5}$"
print(re.findall(pattern7, f))  # []

# 字符串长度必须是5位,以字母、数字、下划线开头,并且以字母、数字、下划线结尾
g = 'messi'
pattern8 = "^\w{5}$"
print(re.findall(pattern8, g))  # ['messi']

2.7 量词

量词         用法说明
*       重复零次或更多次
+      重复一次或更多次
?      重复零次或一次
{n}      重复n次
{n,}     重复n次或更多次
{n,m}     重复n到m次

量词默认是贪婪匹配,尽可能多拿

import re

a = '01111123'
pattern1 = '0([0-9]*)23'  # *重复0次或更多次
print(re.findall(pattern1, a))  # ['11111']

b = 'aabbbcccc'
pattern2 = 'aa([a-z]+)cccc'  # +重复一次或更多次
print(re.findall(pattern2, b))  # ['bbb']

c = '01111123'
pattern3 = '0([0-9]?)23'  # ?重复0次或一次
print(re.findall(pattern3, c))  # []
pattern4 = '011111([0-9]?)3'
print(re.findall(pattern4, c))  # ['2']

d = '01111123'
pattern5 = '0([0-9]{5})23'  # {n}重复n次
print(re.findall(pattern5, d))  # ['11111']

e = '01111123'
pattern6 = '0([0-9]{3,})23'  # {n,}重复n次或更多次  这里最少是3次,包括3
print(re.findall(pattern6, e))  # ['11111']

f = '01111123'
pattern7 = '0([0-9]{2,9})23'  # {n,m}重复n到m次  这里最少是2次,包括2,最多是9次
print(re.findall(pattern7, f))

2.8 量词案例

import re

a = '球王和球玉和球土和球欧冠和球'
pattern1 = '球.?'  # ?匹配0次或1次
print(re.findall(pattern1, a))  # ['球王', '球玉', '球土', '球欧', '球']

b = '球王和球玉和球土和球欧冠和球'
pattern2 = '球.*'  # *匹配0次或无数次
print(re.findall(pattern2, b))  # ['球王和球玉和球土和球欧冠和球']

c = '球王和球玉和球土和球欧冠和球'
pattern3 = '球.+'  # +匹配1次或无数次
print(re.findall(pattern3, c))  # ['球王和球玉和球土和球欧冠和球']

d = '球王和球玉和球土和球欧冠和球'
pattern4 = '球.{1}'  # {1}匹配指定次数1次
print(re.findall(pattern4, d))  # ['球王', '球玉', '球土', '球欧']

e = '球王和球玉和球土和球欧冠和球'
pattern5 = '球.{1,}'  # {1,}匹配1次或更多次
print(re.findall(pattern5, e))  # ['球王和球玉和球土和球欧冠和球']

f = '球王和球玉和球土和球欧冠和球'
pattern6 = '球.{1,3}'  # {1,3}匹配1到3次,尽可能多拿
print(re.findall(pattern6, f))  # ['球王和球', '球土和球']

2.9 分组匹配方法

  (   ) 提升优先级

    |    两个条件任一

     [^ ]  排除指定外的规则

2.10 转义字符 

 

标签:球王,字符,匹配,17,subprocess,re,print,findall
From: https://www.cnblogs.com/hbutmeng/p/18345575

相关文章

  • 17:Python数据类型练习题
    #1获取c1,c2相同的元素列表c1=[11,22,33]c2=[22,33,44]foriinc1:ifiinc2:print(i)#2获取c1中有,c2没有的元素列表foriinc1:ifinotinc2:print(i)#3获取c2中有,c1没有的元素列表foriinc2:ifinotinc1:print(i)#4获......
  • SciTech-Mathematics-Probability+Statistics-Causation vs. Correlation: From Corre
    https://www.statology.org/from-correlation-to-causation-deep-dive-into-data-interpretation/FromCorrelationtoCausation:DeepDiveintoDataInterpretationCorrelationandCausationarekeyconceptsindataanalysis.However,correlationdoesn'tme......
  • Conda配置瘦身术:精通conda config --remove命令
    Conda配置瘦身术:精通condaconfig--remove命令Conda作为Python和其他科学计算语言的包管理器,其灵活性和强大功能在很大程度上依赖于其配置系统。随着时间的推移,Conda配置可能会变得复杂和冗余。condaconfig--remove命令提供了一种方法来清理和删除不需要的配置,保持Conda......
  • 洛谷P5250 【深基17.例5】木材仓库
    【深基17.例5】木材仓库题目描述博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是相同的。作为仓库负责人,你有时候会进货,有时候会出货,因此需要维护这个库存。有不超过100000条的操作:进货,格式1Length:在仓库中放入一根长度为Length(不超过\(10......
  • SRAM的Write Assist与Read Assist
    SRAM的WriteAssist与ReadAssist简介随着工艺节点的不断提升,诸如阈值电压的偏差,以及供电电压的减小,寄生电阻电容的影响等,都会越来越影响SRAM的稳定性。因此需要通过writeAssist和ReadAssist方法来提升SRAM的写入能力,可读性以及稳定性。具体来说,以一个典型的6TSRAM结构为例:......
  • 达梦数据库的系统视图v$mem_reginfo
    达梦数据库的系统视图v$mem_reginfo达梦数据库的V$MEM_REGINFO视图提供了系统当前已分配但未释放的内存信息。这个视图在MEMORY_LEAK_CHECK参数设置为1时才会注册信息,用于监控内存的申请和释放情况。通过查询V$MEM_REGINFO视图,可以关注REFNUM字段,如果该字段值很大,则可能存......
  • SolidJS-forceDirectedGraph(2)
    使用solidJS实现力导向图力导向图参考:https://segmentfault.com/a/1190000016384506力算法代码:/***@desc力算法*/functionforce(data,ctx,size){const{nodes,links}=data;//需要参数constmaxInterval=300;//平衡位置间距cons......
  • SQLServer 事务复制订阅节点非活跃状态(inactive)错误的处理:Error in replication::subs
    事务复制中订阅节点非活动( inactive)错误在SQLServer的事务复制模型中,会出现“订阅过期”的错误,相关订阅分发代理Job的典型错误如下:"AgentSQLNYC01-Onvoices-PubInvoicesInvoices-SQLNYC01-1353is retryingafteranerror. 211retriesattempted.Seeagentjobhistoryin......
  • [Redis]unlink and delete
    redis中的大key和unlink操作1、什么是bigkeyKey本身的数据量过大:一个String类型的Key,它的值为5MB。Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10,000个。Key中成员的数据量过大:一个Hash类型的Key,它的成员数量虽然只有1,000个但这些成员的Value(值)......
  • 【数据保护】微软开源数据保护项目Presidio-中文文本扫描以及注意事项
    Presidio,源自拉丁语,寓意"保护"或"驻军",是由微软推出的一项开源数据保护计划。该项目致力于协助企业与开发者在处理数据时,快速识别并脱敏敏感信息。它能够识别文本和图像中的多种敏感数据,包括但不限于信用卡号码、个人姓名、地理位置和电话号码等,并通过定制化的格式进行脱敏处理......