字符串的索引和切片,指的是从给定字符串中找到和提取出一个或多个单字符,或部分连续的字符。
字符串的索引
字符串的索引,指的是在字符串中找到指定的字符。
【Excel VBA】
Excel VBA中使用Left, Right和Mid等函数可以实现字符串中字符的索引和提取。Left函数从最左边提取指定个数的字符,Right函数从最右边提取指定个数的字符,Mid函数从指定位置开始提取指定个数的字符。如果指定个数是1个,就可以实现单个字符的索引。
下面的代码给定一个字符串,用Left, Right和Mid函数提取子字符串。示例文件的存放路径为Samples\ch06\Excel VBA\索引和切片.xlsm。
Sub Test()
Dim strA As String
Dim strB As String
Dim strC As String
Dim strD As String
strA = "dqexcel"
strB = Left(strA, 1) '最左边的字符
strC = Right(strA, 1) '最右边的字符
strD = Mid(strA, 2, 1) '取第2个字符
strE = Mid(strA, Len(strA) - 1, 1) '取倒数第2个字符
Debug.Print strB
Debug.Print strC
Debug.Print strD
Debug.Print strE
End Sub
运行程序,在立即窗口输出提取的子字符串为:
d
l
q
e
【Python】
Python中,使用[]对字符串进行索引。
下面对给定字符串'abcdefg'进行索引。
>>> a='dqexcel'
>>> a[0] #最左边的字符
'd'
>>> a[-1] #最右边的字符,即倒数第1个字符
'l'
>>> a[1] #第2个字符
'q'
>>> a[-2] #倒数第2个字符
'e'
注意:从左到右索引时基数为0,从右到左索引时基数为-1。
遍历字符串
遍历字符串,指的是在字符串中从左到右逐个查找和获取每个字符。下面遍历给定字符串,输出字符串中的每个字符。
【Excel VBA】
Excel VBA中,使用For循环,用Mid函数获取字符串中的每个字符。示例文件的存放路径为Samples\ch06\Excel VBA\索引和切片.xlsm。
Sub Test2()
Dim strA As String
Dim intI As Integer
strA = "VBA"
For intI = 1 To Len(strA)
Debug.Print Mid(strA, intI, 1)
Next
End Sub
运行程序,在立即窗口输出:
V
B
A
【Python】
Python中获取字符串中每个字符的操作更简单。
>>> for c in 'Python':
print(c)
输出结果为:
P
y
t
h
o
n
字符串的切片
字符串的切片,指的是从字符串中连续查找和获取多个字符。
【Excel VBA】
Excel VBA从给定字符串中定位和提取子字符串,使用Left, Right和Mid等函数。下面的代码给定一个字符串,用Left, Right和Mid函数提取子字符串。示例文件的存放路径为Samples\ch06\Excel VBA\索引和切片.xlsm。
Sub Test3()
Dim strA As String
Dim strB As String
Dim strC As String
Dim strD As String
strA="dqexcel"
strB=Left(strA, 3) '最左边开始取3个字符
strC=Right(strA, 3) '最右边开始取3个字符
strD=Mid(strA, 2, 5) '从第2个(包括第2个)字符开始取5个字符
Debug.Print strB
Debug.Print strC
Debug.Print strD
End Sub
运行程序,在立即窗口输出提取的子字符串为:
dqe
cel
qexce
【Python】
Python中,使用[]对字符串进行切片。切片操作是给定的字符串中提取一个连续的子字符串。Python中字符串切片操作的语法格式和说明如表6-1所示。
表6-1 字符串的切片操作
| 切片操作 | 说 明 | 示例 | 结果 |
|---|---|---|---|
| [:] | 提取整个字符串 | 'abcde'[:] | 'abcde' |
| [start:] | 提取从start位置开始到结尾的字符串 | 'abcde'[2:] | 'cde' |
| [:end] | 提取从头到end-1位置的字符串 | 'abcde'[:2] | 'ab' |
| [start:end] | 提取从start到end-1位置的字符串 | 'abcde'[2:4] | 'cd' |
| [start:end:step] | 提取从start到end-1位置的字符串,步长为step | 'abcde'[1:4:2] | 'bd' |
| [-n:] | 倒数n个字符 | 'abcde'[-3:] | 'cde' |
| [-m:-n] | 倒数第m个到倒数第n+1个 | 'abcde'[-4:-2] | 'bc' |
| [:-n] | 从头到倒数第n+1个 | 'abcde'[:-1] | 'abcd' |
| [::-s] | 步长为s,从右向左反向提取 | 'abcde'[::-1] | 'edcba' |
正向操作时,基数为0,例如:
>>> a='dqexcel'
>>> a[:3] #左侧3个字符
'dqe'
>>> a[-3:] #右侧3个字符
'cel'
>>> a[1:6] #第2个(包括第2个)字符开始取5个字符
'qexce'
索引号1对应的字符是'b',索引号6对应的字符是'g',结果为'bcdef',打头的'b'包括进来了,结尾的'g'则没有包括进来,称为包头不包尾原则。
转义字符
【Python】
Python中用一些字符表示特殊的操作,比如用\n表示换行,用\r表示回车等。这些字符表达的不再是字符本身的意义,称为转义字符。Python中常见的转义字符如表6-2中所示。
表6-2 转义字符
| 转义字符 | 说 明 | 转义字符 | 说 明 |
|---|---|---|---|
| \n | 换行 | \b | 退格 |
| \t | 制表符 | \000 | 空 |
| \\ | 自身转义 | \v | 纵向制表符 |
| \' | 单引号 | \r | 回车 |
| \" | 双引号 | \f | 换页 |
6.1.1小节创建字符串时,如果字符串包含单引号或双引号,使用不同的引号包围字符串来解决。转义字符提供了另一种解决方法,例如:
>>> a='单引号为\'。'
>>> a
"单引号为'。"
>>> b="双引号为\"。"
>>> b
'双引号为"。'
如果希望转义字符保持它原始字符的含义,在字符串前面添加r,指明不转义。例如:
>>> a='Hello \nPython.'
>>> a
'Hello \nPython.'
>>> b=r'Hello \nPython.'
>>> b
'Hello \\nPython.'
变量a引用的字符串中\n进行了转义,变量b引用的字符串中\n指定不转义。所以变量b返回的字符串中,'n'前面有两个斜杠,两个斜杠表示的是斜杠本身。
【Excel VBA】
.Excel VBA中没有转义字符的说法,类似的具有特殊意义的操作直接用Chr函数或特定常数指定,如表6-3所示。
表6-3 Excel VBA中的特殊字符
| 字 符 | Chr函数 | 常数 |
|---|---|---|
| 回车符 | Chr(13) | vbCr |
| 换行符 | Chr(10) | vbLf |
| 回车换行符 | Chr(13)+Chr(10) |
vbCrLf |
| 制表符 | Chr(9) | vbTab |
下面在两个指定字符串中间用制表符间隔形成新字符串。示例文件的存放路径为Samples\ch06\Excel VBA\索引和切片.xlsm。
Sub Test4()
Dim strA As String
strA = "Hello" & vbTab & "VBA"
Debug.Print strA
End Sub
运行程序,在立即窗口输出:
Hello VBA
字符串索引和切片示例-用身份证号求年龄
身份证号中第7至第10位数字表示该同志的出生年份,所以,知道身份证号后可以计算出该同志的年龄。现有一份记录部分人员身份证号的表单如图6-1所示,试根据这些身份证号计算对应人员的年龄。
图6-1 根据给定身份证号计算年龄
【Excel VBA】
Excel VBA用For循环遍历每行数据中的身份证号,使用Mid函数获取身份证号中的年份数据,用Year函数获取当前年份,当前年份减去身份证号中获取的年份,即为所求年龄。示例文件的存放路径为Samples\ch06\Excel VBA\身份证提取年龄.xlsm。
Sub Test()
Dim intI As Integer
Dim intR As Integer
'数据行数
intR = ActiveSheet.Range("C1").End(xlDown).Row
'遍历第3列中的身份证号
For intI = 2 To intR
'当前年份减去身份证中截取的年份,即为年龄
ActiveSheet.Cells(intI, 4).Value = _
Year(Now) - Mid(ActiveSheet.Cells(intI, 3).Value, 7, 4)
Next
End Sub
运行程序,在工作表中第4列输出所求年龄,如图6-1所示。
【Python】
Python中用datetime模块中的now函数获取当前年份,通过字符串切片获取身份证号中的年份,从而计算年龄。本示例的数据文件存放路径为Samples\ch06\Python\身份证提取年龄.xlsx,py文件保存在相同目录下,文件名为sam06-01.py。
import xlwings as xw #导入xlwings包
#从constants类中导入Direction
from xlwings.constants import Direction
import os #导入os包
from datetime import datetime #导入datetime类
#获取本py文件的当前路径
root = os.getcwd()
#创建Excel应用,可见,没有工作簿
app=xw.App(visible=True, add_book=False)
#打开数据文件,可写
bk=app.books.open(fullname=root+\
r'\身份证提取年龄.xlsx',read_only=False)
sht=bk.sheets(1) #获取第1个工作表
#工作表中第3列数据最大行号
rows=sht.api.Range('C1').End(Direction.xlDown).Row
n=1 #记录当前行号
#遍历数据区域的单元格
for rng in sht.range('C2:C'+str(rows)):
n+=1 #行号加1
#获取当前年份,减去身份证号中提取的年份,得到年龄
sht.cells(n,4).value=datetime.now().year\
-int(str(rng.value)[6:10])
运行脚本,在工作表中第4列输出所求年龄,如图6-1所示。