使用多个定界符分割字符串
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:’]))
合并字符串
将字符串合并在一起有多种方案:
- 想要合并的字符串是在一个序列或者 iterable中,可使用 join() 方法
parts = ['Is', 'Chicago', 'Not', 'Chicago?']
' '.join(parts)
- 仅仅只是合并少数几个字符串,使用加号(+)通常已经足够了
a = 'Is Chicago'
b = 'Not Chicago?'
a + ' ' + b
使用加号(+)操作符去连接大量的字符串时效率非常低, 因为加号连接会引起内存复制以及垃圾回收操作,因此不要在循环中使用(+),可用生成器表达式的形式替代:
data = ['ACME', 50, 91.1]
','.join(str(d) for d in data) #利用生成器表达式的形式
- 字符串格式化format
print('{a} {b}'.format(a=a,b=b))
- 避免不必要的字符串连接
print(a + ':' + b + ':' + c) # Ugly
print(':'.join([a, b, c])) # Still ugly
print(a, b, c, sep=':') # Better
字符串反转
把字符串逐字符或者逐词反转过来,字符串无法改变,因此反转一个字符串需要创建一个拷贝
- 字符反转
a = '123456'
rev = a[::-1] #采用步长为-1的切片
rev2 = ''.join(reversed(a)) #需要再调用join
- 词反转,不考虑原先的空格
rev = ' '.join(a.split()[::-1])
- 词反转不改变原先空格
import re
rev = ''.join(re.split(r'\s+',a)[::-1])
字符串中插入变量
创建一个内嵌变量的字符串,变量被它的值所表示的字符串替换掉
Python没有对在字符串中简单替换变量值提供直接的支持。方法有两种:
- 通过使用字符串的 format()
- 结合使用 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