Python 进阶1----string的常用操作

使用多个定界符分割字符串

split()可以采用单一形式的分割符切割字符串,re可以采用多个分隔符一次性切割字符串

import re
line = 'asdf fjdk; afed, fjek,asdf, foo'
re.split(r'[;,\s]\s*', line)   #以逗号,分号,空格切分
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

上例中分隔符可以是逗号,分号或者是空格,并且后面紧跟着任意个的空格。

正则表达式中的特殊字符:

特殊表达式序列意义
\A只在字符串开头进行匹配。
\b匹配位于开头或者结尾的空字符串
\B匹配不位于开头或者结尾的空字符串
\d匹配任意十进制数,相当于 [0-9]
\D匹配任意非数字字符,相当于 [^0-9]
\s匹配任意空白字符,相当于 [ \t\n\r\f\v]
\S匹配任意非空白字符,相当于 [^ \t\n\r\f\v]
\w匹配任意数字和字母,相当于 [a-zA-Z0-9_]
\W匹配任意非数字和字母的字符,相当于 [^a-zA-Z0-9_]
\Z只在字符串结尾进行匹配

字符串开头或结尾匹配

通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀,URL Scheme等等

import os
 filenames = os.listdir('.')   #[ 'Makefile', 'foo.c', 'bar.py', 'spam.c', 'spam.h' ]
 [name for name in filenames if name.endswith(('.c', '.h')) ]  #'foo.c', 'spam.c', 'spam.h'

from urllib.request import urlopen
def read_data(name):
    if name.startswith(('http:', 'https:', 'ftp:')):  #参数为tuple形式
        return urlopen(name).read()
    else:
        with open(name) as f:
            return f.read()

startswith和endswith的参数必须为元组的形式tuple(),如:url.startswith(tuple([‘http:’, ‘https:’, ‘ftp:’]))

合并字符串

将字符串合并在一起有多种方案:

  1. 想要合并的字符串是在一个序列或者 iterable中,可使用 join() 方法
parts = ['Is', 'Chicago', 'Not', 'Chicago?']
' '.join(parts)
  1. 仅仅只是合并少数几个字符串,使用加号(+)通常已经足够了
a = 'Is Chicago'
 b = 'Not Chicago?'
a + ' ' + b

使用加号(+)操作符去连接大量的字符串时效率非常低, 因为加号连接会引起内存复制以及垃圾回收操作,因此不要在循环中使用(+),可用生成器表达式的形式替代:

data = ['ACME', 50, 91.1]
 ','.join(str(d) for d in data)  #利用生成器表达式的形式
  1. 字符串格式化format
print('{a} {b}'.format(a=a,b=b))
  1. 避免不必要的字符串连接
print(a + ':' + b + ':' + c) # Ugly
print(':'.join([a, b, c])) # Still ugly
print(a, b, c, sep=':') # Better

字符串反转

把字符串逐字符或者逐词反转过来,字符串无法改变,因此反转一个字符串需要创建一个拷贝

  1. 字符反转
a = '123456'
rev = a[::-1]   #采用步长为-1的切片
rev2 = ''.join(reversed(a))  #需要再调用join
  1. 词反转,不考虑原先的空格
rev = ' '.join(a.split()[::-1])
  1. 词反转不改变原先空格
import re
rev = ''.join(re.split(r'\s+',a)[::-1])

字符串中插入变量

创建一个内嵌变量的字符串,变量被它的值所表示的字符串替换掉
Python没有对在字符串中简单替换变量值提供直接的支持。方法有两种:

  1. 通过使用字符串的 format()
  2. 结合使用 format_map() 和 vars()
s = '{name} has {n} messages.'
print(s.format(name='Guido', n=37))

name = 'wang'
n = 1
print(s.format_map(vars()))

vars() 还有一个有意思的特性就是它也适用于对象实例,但是有一个缺陷,缺陷就是变量缺失时会报错

class Info:
    def __init__(self, name):
        self.name = name
        # self.n = n

class safesub(dict):
    def __missing__(self, key):
        return '{' + key + '}'

a = Info('Guido1')
v = s.format_map(safesub(vars(a)))   #Guido1 has {n} messages.

封装:
import sys

def sub(text):
    return text.format_map(safesub(sys._getframe(1).f_locals))

name = 'happy'
print(sub('Hello {name}'))

参考:https://python3-cookbook.readthedocs.io/zh_CN/latest/preface.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值