索引和切片

字符串的索引和切片,指的是从给定字符串中找到和提取出一个或多个单字符,或部分连续的字符。

字符串的索引

字符串的索引,指的是在字符串中找到指定的字符。

【Excel VBA】

Excel VBA中使用Left, Right和Mid等函数可以实现字符串中字符的索引和提取。Left函数从最左边提取指定个数的字符,Right函数从最右边提取指定个数的字符,Mid函数从指定位置开始提取指定个数的字符。如果指定个数是1个,就可以实现单个字符的索引。

下面的代码给定一个字符串,用Left, Right和Mid函数提取子字符串。示例文件的存放路径为Samples\ch06\Excel VBA\索引和切片.xlsm。

code.vba
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

运行程序,在立即窗口输出提取的子字符串为:

code.vba
d
l
q
e

【Python】

Python中,使用[]对字符串进行索引。

下面对给定字符串'abcdefg'进行索引。

code.python
>>> 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。

code.vba
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

运行程序,在立即窗口输出:

code.vba
V
B
A

【Python】

Python中获取字符串中每个字符的操作更简单。

code.python
>>> for c in 'Python':
print(c)

输出结果为:

code.python
P
y
t
h
o
n

字符串的切片

字符串的切片,指的是从字符串中连续查找和获取多个字符。

【Excel VBA】

Excel VBA从给定字符串中定位和提取子字符串,使用Left, Right和Mid等函数。下面的代码给定一个字符串,用Left, Right和Mid函数提取子字符串。示例文件的存放路径为Samples\ch06\Excel VBA\索引和切片.xlsm。

code.vba
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

运行程序,在立即窗口输出提取的子字符串为:

code.vba
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,例如:

code.python
>>> 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小节创建字符串时,如果字符串包含单引号或双引号,使用不同的引号包围字符串来解决。转义字符提供了另一种解决方法,例如:

code.python
>>> a='单引号为\'。'
>>> a
"单引号为'。"
>>> b="双引号为\"。"
>>> b
'双引号为"。'

如果希望转义字符保持它原始字符的含义,在字符串前面添加r,指明不转义。例如:

code.python
>>> 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。

code.vba
Sub Test4()
  Dim strA As String
  strA = "Hello" & vbTab & "VBA"
  Debug.Print strA
End Sub

运行程序,在立即窗口输出:

code.vba
Hello   VBA

字符串索引和切片示例-用身份证号求年龄

身份证号中第7至第10位数字表示该同志的出生年份,所以,知道身份证号后可以计算出该同志的年龄。现有一份记录部分人员身份证号的表单如图6-1所示,试根据这些身份证号计算对应人员的年龄。

Document Image

图6-1 根据给定身份证号计算年龄

【Excel VBA】

Excel VBA用For循环遍历每行数据中的身份证号,使用Mid函数获取身份证号中的年份数据,用Year函数获取当前年份,当前年份减去身份证号中获取的年份,即为所求年龄。示例文件的存放路径为Samples\ch06\Excel VBA\身份证提取年龄.xlsm。

code.vba
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。

code.python
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所示。