首页 > 编程笔记 > Python笔记 阅读:31

Python字符串类型的定义和使用

字符串(str)是 Python 非常重要的数据类型,是用英文引号括起来的一段文本。引号可以是单引号、双引号、三引号(三个单引号或者三个双引号),必须成对出现,引号中间的文本内容是字符串承载的数据。

如果只写一对引号,无任何内容(包括空格),该字符串就被称为空字符串。

在 Python 中没有 char(字符)这种数据类型。字符串中的字符数量可以是任意个,包括 0 个、1 个或者多个。单引号和双引号多用于定义一行文本,三引号多用于定义一段文本(有跨行的内容出现)。字符串可用来表示 IP 地址、设备名称、配置文本、配置命令等信息。

字符串的定义如下所示:
dev_ip = '192.168.137.201'
dev_name = 'as01'
dev_manufacture = 'HUAWEI'
dev_room = '0401'
intf_config = '''interface Vlan20
ip address 192.168.137.201 255.255.255.0
'''
cmd = "show version"
单引号和双引号本质上没有区别。作者习惯用单引号来表示单行的字符串,这样的代码在视觉上更清晰、易读。

Python字符串的转义

计算机编码中除了可显示字符外,还有一些有特殊含义的不可见字符。这类字符是经过转义的字符,例如使用 \n 代表换行符,反斜杠(\)与后面的字母 n 组合在一起,字母 n 不再代表原来的字母,而是形成了新的字符,这就是转义。

反斜杠被称为转义符号,\n 被称为转义字符。常用的转义字符如下表所示。

表:常用的转义字符
转义字符 说明
\n 换行,将光标位置移到下一行开头
\r 将光标位置移到本行开头
\' 单引号,在单引号定义的字符串中使用单引号,需要使用转义字符的单引号
\" 双引号,在双引号定义的字符串中使用双引号,需要使用转义字符的双引号
\\ 斜杠符号,\ 本身是转义符号,如果想用 \ 表示字符串本身的含义而非转义,就需要使用双反斜杠

在后续的开发中会使用文件路径作为变量,而 Windows 系统的路径是反斜杠,正好与转义符号冲突。处理方式一般有两种:
【实例】路径中转义符号的处理。
filepath = 'D:\\config.txt'
filepath = r'D:\config.txt'

Python字符串常用方法

Python 的字符串提供了很多方法,可以便捷地处理文本,例如格式化、查找、分割、大小写转换等,下面将简单介绍一些实际开发中常用的方法。

1) format()方法

字符串格式化是指按照预定义模式,对传入的字符串进行填充,并输出格式化后的字符串的过程。

Python 的字符串格式化方法很多,这里主要介绍易上手且不易出错的 format() 方法。首先定义一个字符串模板,并将需要填充值的位置用花括号({})括起来。然后对字符串模板调用 format() 方法,依次传入要填充的变量,填充变量的数量和顺序要与花括号对应。

【实例】基于位置的 format() 方法的使用。
server = 'host01'
ip_addr = '192.168.1.100'
 
intf_desc_tpl = 'connect to {}, ip:{}'
intf_desc = intf_desc_tpl.format(server,ip_addr)
 
print(intf_desc)  # 结果是"connect to host01, ip:192.168.1.100"
format() 方法还有另一个书写方式:首先在定义字符串模板时,在花括号内输入需要填充参数的参数名;然后在调用 format() 方法时,使用<参数名>=<值或变量名>的方式进行赋值。此方法可读性更好、更灵活(无须考虑参数顺序)。

【实例】基于参数名的 format() 方法的使用。
server = 'host01'
ip_addr = '192.168.1.100'
 
intf_desc_tpl = 'connect to {SERVER}, ip:{SERVER_IP}'
intf_desc = intf_desc_tpl.format(SERVER=server, SERVER_IP=ip_addr)
 
print(intf_desc)  # 结果是"connect to host01, ip:192.168.1.100"

2) find()方法

find() 方法用于查找字符串中包含指定的子字符串(简称子串)的开始位置,如果发现子串,就返回子串首字母出现的位置索引值(Python 中的索引值从 0 开始);如果未发现子串,就返回 −1。

在 Python 网络运维自动化实践中,find() 方法多用于判断指定字符串是否包含某关键字,小于 0 代表未发现子串,大于等于 0 代表发现了子串。

【实例】find()方法的使用。
intf_show = 'Eth1/1 is up'
up_index = intf_show.find('up')
print(up_index) # 输出结果为 10

3) startswith()方法

startswith() 方法用于判断字符串是否以指定的字符串开始,输出结果是真(True)或假(False)。

【实例】startswith() 方法的使用。
intf_show = 'Ethernet1/1 is up'
is_interface_line = intf_show.startswith('Ethernet')
print(is_interface_line)  # 输出结果是True

4) endswith()方法

endswith() 方法用于判断字符串是否以指定的字符串结束,输出结果是真(True)或假(False)。

【实例】endswith() 方法的使用。
intf_show = 'Ethernet1/1 is up'
interface_up = intf_show.endswith('up')
print(interface_up) # 输出结果是True

5) split()方法

split() 方法用于分割字符串,返回的结果是分割后的字符串的列表。

split() 方法默认用空白符进行切割。空白符泛指没有显示却又占位置的符号,例如空格、制表符、换行符。

【实例】split() 方法的基本使用。
intf_show = 'Ethernet1/1 is up'
result = intf_show.split()
print(result)  # 输出结果是['Ethernet1/1', 'is', 'up']
通过 split() 方法,读者可以执行 display interface brief 命令,从而获取简单的表状配置文本,并从中提取相关信息。其用法是针对每行文本使用 split() 方法进行分割,然后通过列表的索引就可以访问对应字段的值。

split() 方法也可以用指定的字符串去分割,例如使用“is”去分割。

【实例】带参数的 split() 方法使用。
intf_show = 'Ethernet1/1 is up'
result = intf_show.split('is')
print(result)  # 输出结果是['Ethernet1/1 ', ' up']
这种方法可以直接获取端口名称和状态。对于代码执行结果中的端口名称和状态中的多余的空格,可以通过 strip() 方法去除。

6) strip()方法

strip() 方法用于去除字符串左右的指定字符串,并将去除指定字符串后的内容以字符串形式返回。

strip() 方法默认去除字符串左右的所有空白符,也可以去除方法内直接传入的字符串。

strip() 还有两个变种方法:lstrip() 和 rstrip(),分别去除左侧和右侧的指定字符串,读者了解即可。

【实例】strip() 方法的基本使用。
intf_show = '    Ethernet1/1 is up    '
result = intf_show.strip()
print(result)  # 输出结果是"Ethernet1/1 is up"

7) splitlines()方法

splitlines()方法用于按行分割字符串,并返回一个字符串的列表,默认情况下,行结束符号由 Python 自动判断。

splitlines() 多用于将网络配置文本按行分割,以便后续针对每行文本进行配置和解析。

【实例】splitlines() 方法的使用。
intf_config = '''interface Vlan20
ip address 192.168.137.201 255.255.255.0
'''
configs = intf_config.splitlines()
 
print(configs)
# 输出结果是['interface Vlan20', ' ip address 192.168.137.201 255.255.255.0']

8) replace()方法

replace() 方法用于将字符串中的特定子串替换为指定的字符串,并返回替换后的结果。它有两个参数:
【实例】replace()方法的使用。
intf_name = 'Eth1/1'
full_intf_name = intf_name.replace('Eth', 'Ethernet')
print(full_intf_name)  # 输出结果是"Ethernet1/1"

相关文章