60D2 – 数据类型

基本数据类型

字符串

Python 中并没有像 C++ 那样的字符类型(char),所有的字符都被统一成了 str 对象。即使是单个字符 c,它的类型也是 str。

str 类型是高频使用的类型,这里先列举 5 个例子。

strip 用于去除字符串前后的空格:

In	[1]:'        SAGA Site'.strip()
Out	[1]:'SAGA Site'

replace 用于字符串的替换:

In	[2]:'SAGA Site'.replace(' ', '_')
Out	[2]:'SAGA_Site'

join 用于合并字符串:

In	[3]:'_'.join(['SAGA', 'Site', 'Python'])
Out	[3]:'SAGA_Site_Python'

title 用于单词的首字母大写:

In	[4]:'saga site'.title()
Out	[4]:'Saga Site'

find 用于返回匹配字符串的起始位置索引:

In	[5]:'I love python'.find('python')
Out	[5]:7

举个应用字符串的案例,判断 str1 是否由 str2 旋转而来。
字符串 stringbook 和 bookstring,写一段代码验证 str1 是否为 str2 旋转得到。
转化为判断:str1 是否为 str2+str2 的子串。

下面函数原型中,注明了每个参数的类型、返回值的类型以增强代码的可读性和可维护性。

def is_rotation(s1: str, s2: str) -> bool:
    if s1 is None or s2 is None:
        return False
    if len(s1) != len(s2):
        return False

    def is_substring(s1: str, s2: str) -> bool:
        return s1 in s2
    return is_substring(s1, s2 + s2)

测试函数 is_rotation:

r = is_rotation('stringbook', 'bookstring')
print(r)  # True

r = is_rotation('greatman', 'maneatgr')
print(r)  # False

字符串的匹配操作除了使用 str 封装的方法外,Python 的 re 正则模块功能更加强大,写法更为简单,广泛用于怕中、数据分析等。

下面这个案例实现:密码安全检查,使用正则表达式非常容易实现。

密码安全要求:

  • 要求密码为 6 到 20 位;
  • 密码只包含英文字母和数字。
import re
pat = re.compile(r'\w{6,20}')
# 这是错误的,因为 \w 通配符匹配的是字母,数字和下划线,题目要求不能含有下划线  
# 使用最稳的方法:\da-zA-Z 满足“密码只包含英文字母和数字”  
# \d 匹配数字 0-9  
# a-z 匹配所有小写字符;A-Z 匹配所有大写字符  
pat = re.compile(r'[\da-zA-Z]{6,20}')

选用最保险的 fullmatch 方法,查看是否整个字符串都与规则相匹配。
以下的测试返回例子为 None,原因见注释。

pat.fullmatch('qaz12')		# 返回 None,长度小于 6
pat.fullmatch('qaz12wsxedcrfvtgb67890942234343434')
							# 返回 None,长度大于 22
pat.fullmatch('qaz_231')	# 返回 None,含有下划线

下面这个字符串 n0passw0Rd 完全符合:

In	[20]:	pat.fullmatch('n0passw0Rd')
Out	[20]:	<re.Match object; span=(0, 10), match='n0passw0Rd'>
页面: 1 2 3 4

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注