Python 编程骚操作连载(一)- 字符串、列表、字典和集合的处理(Part A)

简介: Python 编程骚操作连载(一)- 字符串、列表、字典和集合的处理(Part A)

一、字符串的处理

拆分含有多种分隔符的字符串

如何对一个含有多种特殊字符的字符串进行分割处理,比如向下面这种字符串

str = "A&man$;*who/stands|for+noting=will-fall,for%anything"
复制代码

如何去除特殊风格符获取字符串中所有单词的列表?

如果字符串中只包含单一分隔符的话,可以使用字符串对象的 split 方法,该方法的第一个参数就是分隔符,默认是空格。

str = "A man who stands for noting will fall for anything"
str_list = str.split()
print(str_list)
复制代码

执行上述代码,输出结果如下:

['A', 'man', 'who', 'stands', 'for', 'noting', 'will', 'fall', 'for', 'anything']
复制代码

针对包含多种分割符的情况下可以连续调用字符串对象的 split 方法,每次处理一种分隔符

str = "A&man$;*who/stands|for+noting=will-fall,for%anything"
# 第一次处理
res = str.split('&')
print(res)
temp = []
list(map(lambda x: temp.extend(x.split('$')), res))
print(temp)
# 第二次处理
res = temp
temp = []
list(map(lambda x: temp.extend(x.split(';')), res))
print(temp)
# 第三次处理
res = temp
temp = []
list(map(lambda x: temp.extend(x.split('*')), res))
print(temp)
复制代码

执行上述代码,输出结果如下:

['A', 'man$;*who/stands|for+noting=will-fall,for%anything']
['A', 'man', ';*who/stands|for+noting=will-fall,for%anything']
['A', 'man', '', '*who/stands|for+noting=will-fall,for%anything']
['A', 'man', '', '', 'who/stands|for+noting=will-fall,for%anything']
复制代码

根据输出结果可以确定,第一次处理是将字符串中的 &,第二次处理掉了 $...。依次类推,可以将代码抽取为一个函数

def split_multi_chars(str, chars):
    res = [str]
    for c in chars:
        t = []
        list(map(lambda x: t.extend(x.split(c)), res))
        res = t
        print(res)
    return res
str_data = "A&man$;*who/stands|for+noting=will-fall,for%anything"
chars = '&$;*/|+=-,%'
print(split_multi_chars(str_data, chars))
复制代码

执行上述代码,输出结果如下:

['A', 'man$;*who/stands|for+noting=will-fall,for%anything']
['A', 'man', ';*who/stands|for+noting=will-fall,for%anything']
['A', 'man', '', '*who/stands|for+noting=will-fall,for%anything']
['A', 'man', '', '', 'who/stands|for+noting=will-fall,for%anything']
['A', 'man', '', '', 'who', 'stands|for+noting=will-fall,for%anything']
['A', 'man', '', '', 'who', 'stands', 'for+noting=will-fall,for%anything']
['A', 'man', '', '', 'who', 'stands', 'for', 'noting=will-fall,for%anything']
['A', 'man', '', '', 'who', 'stands', 'for', 'noting', 'will-fall,for%anything']
['A', 'man', '', '', 'who', 'stands', 'for', 'noting', 'will', 'fall,for%anything']
['A', 'man', '', '', 'who', 'stands', 'for', 'noting', 'will', 'fall', 'for%anything']
['A', 'man', '', '', 'who', 'stands', 'for', 'noting', 'will', 'fall', 'for', 'anything']
['A', 'man', '', '', 'who', 'stands', 'for', 'noting', 'will', 'fall', 'for', 'anything']
复制代码

根据要去除的特殊字符组成的字符串,依次去除了目标字符串中的所有特殊字符,但是最终输出的字符串中包含了空字符串,可以通过列表推导式去除

def split_multi_chars(str, chars):
    # 其余代码保持不变
    # 使用列表推导式去除空字符串
    return list(x for x in t if x)
# 其余代码保持不变
复制代码

再次执行上述代码,输出结果如下:

# 其余输出结果与上次一致
['A', 'man', 'who', 'stands', 'for', 'noting', 'will', 'fall', 'for', 'anything']
复制代码

除了通过连续调用字符串对象的 split 方法依次去除目标字符串中的特殊字符外,还可以通过正则表达式的 split 方法来去除字符串中的特殊字符。

import re
str = "A&man$;*who/stands|for+noting=will-fall,for%anything"
chars = '&$;*/|+=-,%'
res = re.split(r'[=,&$;*/|+%-]+', str)
print(res)
复制代码

执行上述代码,输出结果如下:

['A', 'man', 'who', 'stands', 'for', 'noting', 'will', 'fall', 'for', 'anything']
复制代码

字符串中时间格式的替换

以程序运行过程中生成的日志为例,如果想要替换其中的时间格式应该如何操作?

'Started GET "/students" for 127.0.0.1 at 2022-06-11 01:28:05 +0800'
复制代码

可以使用正则表达式的 sub 方法替换字符串,首先使用正则表达式匹配到时间的内容如年月日等,再调整匹配到的内容的顺序。

import re
log = 'Started GET "/students" for 127.0.0.1 at 2022-06-11 01:28:05 +0800'
res = re.sub('(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', log)
# 给每个组起名
res_01 = re.sub('(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})', r'\g<month>/\g<day>/\g<year>', log)
print(res)
print(res_01)
复制代码

执行上述代码,输出结果如下:

Started GET "/students" for 127.0.0.1 at 06/11/2022 01:28:05 +0800
Started GET "/students" for 127.0.0.1 at 06/11/2022 01:28:05 +0800
复制代码

时间格式已被成功替换为指定的格式。

字符串的拼接

对于字符串拼接来说最常用的方法就是 + 操作符,起始 + 操作符是调用了 str 对象底层的 __add__ 方法实现的拼接,包括其他的操作符如 ><= 等都是调用的底层的以双下划线开头和结尾的方法

str_01 = '234324'
str_02 = 'adcdaf'
print(str_01.__add__(str_02))
print(str.__add__(str_01, str_02))
print(dir(str))
复制代码

执行上述代码,输出结果如下:

37ee32c507c14474be5e4a06244c7147_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

当使用 + 操作符拼接多个字符串时会伴随着大量的字符串的创建和销毁,如果要拼接的字符串非常多,这将会消耗大量的资源,而 str 对象的 join 方法可以更加快速的拼接字符串列表中所有的字符串。

new_str = ' '.join(['A', 'man', 'who', 'stands', 'for', 'noting', 'will', 'fall', 'for', 'anything'])
print(new_str)
复制代码

执行上述代码,输出结果如下:

A man who stands for noting will fall for anything
复制代码

如果要拼接的元素中不只是字符串类型,还包含了其他类型,如数字等,则可以使用生成器表达式,将其他类型元素转换为字符串类型之后再进行拼接。

list_data = ['A', 'man', 'who', 123, 'for', 1345, 'will', 'fall']
new_str = ''.join(str(x) for x in list_data)
print(new_str)
复制代码

执行上述代码,输出结果如下:

Amanwho123for1345willfall
复制代码

推荐使用生成器表达式,不推荐使用列表表达式,列表表达式会返回一个列表


相关文章
|
10天前
|
Python
SciPy 教程 之 SciPy 模块列表 16
SciPy教程之SciPy模块列表16 - 单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了力学单位的使用,如牛顿、磅力和千克力等。
12 0
|
10天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy 教程之 SciPy 模块列表 15 - 功率单位。常量模块包含多种单位,如公制、质量、时间等。功率单位中,1 瓦特定义为 1 焦耳/秒,表示每秒转换或耗散的能量速率。示例代码展示了如何使用 `constants` 模块获取马力值(745.6998715822701)。
13 0
|
10天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy教程之SciPy模块列表15:单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。功率单位以瓦特(W)表示,1W=1J/s。示例代码展示了如何使用`constants`模块获取马力(hp)的值,结果为745.6998715822701。
13 0
|
11天前
|
C语言 Python
探索Python中的列表推导式:简洁而强大的工具
【10月更文挑战第24天】在Python编程的世界中,追求代码的简洁性和可读性是永恒的主题。列表推导式(List Comprehensions)作为Python语言的一个特色功能,提供了一种优雅且高效的方法来创建和处理列表。本文将深入探讨列表推导式的使用场景、语法结构以及如何通过它简化日常编程任务。
|
12天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy 教程之 SciPy 模块列表 13 - 单位类型。常量模块包含多种单位:公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例:`constants.zero_Celsius` 返回 273.15 开尔文,`constants.degree_Fahrenheit` 返回 0.5555555555555556。
12 0
|
28天前
|
存储 安全 Serverless
Python学习四:流程控制语句(if-else、while、for),高级数据类型(字符串、列表、元组、字典)的操作
这篇文章主要介绍了Python中的流程控制语句(包括if-else、while、for循环)和高级数据类型(字符串、列表、元组、字典)的操作。
29 0
|
1月前
|
Python
Python操作:字符串--列表--元组--字典--运算符 (一)
Python操作:字符串--列表--元组--字典--运算符 (一)
|
1月前
|
Python
Python操作:字符串--列表--元组--字典--运算符 (二)
Python操作:字符串--列表--元组--字典--运算符 (二)
|
3月前
|
存储 数据安全/隐私保护 索引
Python基础语法day02字符串详解和列表
Python基础语法day02字符串详解和列表
|
6月前
|
存储 索引 Python
Python基础 笔记(七) 容器--字符串、列表
Python基础 笔记(七) 容器--字符串、列表
50 4

热门文章

最新文章