python-小知识点 ---字符串处理

对于字符串的处理无论是哪种语言都是相当重要的
python对于字符串的处理提供了大量的内建函数:

必须掌握两种计算字符串处理技巧

  • 首先是正则表达式,一种基于模式的文本匹配方法。虽然关于正则表达式有许多精彩的介绍,但是大家仍然可以在网上找到关于这个主题的一些视频:如:fast.ai代码 -初涉自然语言处理等。

  • 另一个必备的字符串处理技能是:能够利用给定编程语言的标准库进行基本的字符串操作


字符串表示方法

  • 可以使用单引号,双引号包含字符串
  • 连续三个单引号或三个双引号,可以帮助我们创建多行字符串
  • r字符串不转义
  • 常用转义符号 
    \  反斜杠符号
    ’  单引号
    "  双引号
    \b  退格(Backspace)
    \n  换行
    \t  横向制表符
    \r  回车

常用操作

  • 字符串提取
    python字符串可以使用下标直接提取字符,用时有切片功能,可用于快熟提取子串
    注意提取规则是前包后不包
s = '12345678'
print(s[3]) # 提取第四个字符
print(s[:3]) # 提取前三个字符
print(s[-3:]) # 提取倒数三个字符
print(s[1:3]) # 提取一到三个字符
print(s[3::2]) # 提取第四个字符到最后,间隔2提取
print(s[::]) # 提取所有字符
print(s[::-1]) # 翻转
  • 字符串比较和同一性
    我们可以直接使用**==, !=**对字符串进行比较,是否含有相同的字符
    我们使用 is / not is,判断两个对象是否同一个对象。比较的是对象的地址,即 id(obj1)是否和 id(obj2)相等
  • 用 in 判断是否包含
  • = 使用等于直接复制
    要注意浅拷贝问题
  • +加号可以用于拼接
    拼接后返回新的字符串

常用内建函数

  • str: 将其他数据类型转换为字符串

  • len: 字符串长度
    UTF-8编码,汉字占3个字节
    GBK或者GB2312,汉字占2个字节

  • count: 指定字符串出现次数
    次数统计常用的库 from collections import Counter

  • strip/lstrip/rstrip: 删除字符串两边的指定字符

  • split/splitlines/partition: 分割字符串
    splitlines 按照行(’\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表
    partition 对字符串进行分割返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串

  • join: 链接字符串

  • replace: 字符串替换

  • index/rindexfind/rfind: 用于字符串查找,index找不到会报错,find返回-1
    只有在需要知道sub的位置时才应使用该方法。要检查sub是否是子字符串,请使用 in运算符

  • lower/upper/swapcase/capitalize: 用于大小写转换

  • center/ljust/rjust/zfill: 字符串填充/对齐
    ^、<、>分别是居中、左对齐、右对齐,后面带宽度
    :号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充

  • isalnum/isalpha/isdigit/isspace/islower/isupper/istitle : 字符串格式判断

  • startswith/endswith: 开始/结尾判断

  • format: 格式化
    所谓格式化字符串就是先制定一个模板,在模板中预留几个空位,然后根据需要填上相应内容
    使用“%”操作符
    语法格式: ‘%[-][+][0][.n]格式化字符’%exp
    参数说明
    -:可选参数,用于指定左对齐,正数前方无符号,负数前面加负号
    +:可选参数,用于指定右对齐,正数前方加正号,负数前方加负号
    0:可选参数,表示右对齐,正数前方无符号,负数前方加负号,用0填充空白处
    m:可选参数,表示占有宽度
    n:可选参数,表示小数点后保留的位数

  • ord: 可以把字符转换成对应的 Unicode 码相对的函数 chr

  • encode: 转码

正则表达式

除了常规的方法以外,更强大的字符处理工具费正则表达式莫属了
正则表达式方法有很多,网上有大量的教程,这里只是对常用函数大概说明,具体细节请网上了解
在这里插入图片描述


实例记录

  • 字符串按数量切分
def str_split(src, num, reversed=False):
    l = len(src)
    result = []
    start = 0

    if reversed:
        end = l % num or num
    else:
        end = num

    for i in (range(l // 4+1) if l % 4 else range(l // 4)):
        print(i, start, end)
        result.append(src[start:end])
        start, end = end, end+4

    return result

print(str_split('123456780', 4))
print(str_split('123456789', 4, True))

输出

['1234', '5678', '0']
['1', '2345', '6789']
  • 大数据查找
    从大型文本文件(> 1 GB)中提取数据
    问题基本上可以归结为:从文件中选择文本行,然后从某个数组中搜索字符串以查找字符串(此数组中可以包含多达千个字符串)。这里的问题是我必须找到该字符串的特定出现,并且该字符串在该文件中可能出现无数次

基本实现方式,逻辑简单但运行速度慢,耗时巨大

strings = [a for a in open('file.txt')]  # 关键字列表

with open("err.txt", "r") as f:
    for chunk in f:
        for s in strings
            #do search, trimming, stripping ..

在了解了字符串是如何以二进制(ASCII,UTF-8)编码的,则可以一次mmap将整个文件存入内存,因此就像获得了大bytearray/bytes,那么mmap可以用bytes正则表达式(Python 3)搜索这样的对象

mmap是许多操作系统上最快的解决方案,因为只读映射意味着OS可以在页面准备就绪时自由地映射它们。不需要交换空间,因为数据由文件支持。操作系统还可以直接从零缓存复制映射缓存中的数据,从而在裸读上实现双赢

import mmap
import re

pattern = re.compile(b'the ultimate answer is ([0-9]+)')  # 要搜索的目标
with open("err.txt", "rb") as f:
    # memory-map the file, size 0 means whole file
    mm = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)

    # PROT_READ only on *nix as the file is not writable
    for match in pattern.finditer(mm):
        # process match
        print("The answer is {}".format(match.group(1).decode('ascii')))

    mm.close()

注:
1.字符串对象是不可改变的,也就是说在python创建一个字符串后,你不能把这个字符中的某一部分改变。任何上面的函数改变了字符串后,都会返回一个新的字符串,原字串并没有变

2.Python 不支持单字符类型,单字符也是作为一个字符串

你可能感兴趣的:(python-小知识)