字符串处理是编程中常用到的操作,本系列总结的目标是通过系统的介绍不同的方法来完成不同复杂度的字符串处理操作。旨在方便大家遇到不同的需求时,可以快速找到合适的处理方式,从而使代码开发快速,简洁,稳定的目的。
本文为系列第三篇,更pythonic的方式进行字符串处理. 中点介绍一下Python3.6 新引入的字符串格式化方法f-string
1.f-string
一个更加优雅的格式化字符串的方法,str模块的介绍中,提到格式化字符串的方法str.format
,它虽然比%的格式化方式易读性强一些,但面对多个参数的长字符串时,代码还是会比较冗余。例如:
first_name = "Bruce"
last_name = "Lee"
age = 32
profession = "mixed martial artist"
introduction = "actor, director and philosopher."
print(("Hello, {first_name} {last_name}. You are {age}. " +
"You are a {profession} and {introduction}.") \
.format(first_name=first_name, last_name=last_name, age=age, \
profession=profession, introduction=introduction))
f-string 类似str.format的用法,但是代码更加简洁
first_name = "Bruce"
last_name = "Lee"
age = 32
profession = "mixed martial artist"
introduction = "actor, director and philosopher."
print(f"Hello, {first_name} {last_name}. You are {age}. \
You are a {profession} and {introduction}.")
除此之外,还有一下几个特点
1.支持表达式计算
In : f'38 * 2 = {38 * 2}'
Out: '38 * 2 = 76'
2.支持方法和函数调用
In : a = 'string'
In : f'render my {a.upper()}'
Out: 'render my STRING'
In : f'render my {a[:3]}'
Out: 'render my str'
In : def double(s):
return s * 2
In : f'render my {double(a)}'
Out: 'render my stringstring'
3.对其和填充
f-string采用 {content:format}
设置字符串格式, 描述符 '<', '>', '^' 分别对应str.ljust, str.rjust, str.center
In : a = 'string'
In : f'render my {a:<20}'
Out: 'render my string '
In : f'render my {a:-<20}'
Out: 'render my string--------------'
In : f'render my {a:-^20}'
Out: 'render my -------string-------'
In : f'render my {a:->20}'
Out: 'render my --------------string'
其他描述符用法, 见官方文档
2. parse
说完了字符串格式化, 介绍一个pythonic 的数据抽取的第三方库, 源码地址
2.1 安装方式
pip install parse
2.2 使用方式
parse 库可以看作是对f-string的反向操作, 用{} 标记出位置, 将目标字符串对应的数据抽取出来, 可以不用写正则表达式,即可完成数据抽取.
2.2.1 parse
和str.format的语法一致. position抓取的数据会放到Result.fixed中,命名的变量会存到Result.named中
In : from parse import parse
In : ret = parse("It's {}, I love {food}!", "It's Bruce, I love hamburger!")
In : ret.fixed
Out: ('Bruce',)
In : ret.named
Out: {'food': 'hamburger'}
2.2.2 search
search 和 re.search功能类似, 扫描目标字符串, 查找匹配的目标数据, 找不到的话返回None
# 未命名变量,匹配结果放到Result.fixed元组中
In : search('Age: {}\n', 'Name: Rufus\nAge: 42\nColor: red\n')
Out: <Result ('42',) {}>
# 未命名变量,没有匹配结果 返回None
In : search('Ale: {}\n', 'Name: Rufus\nAge: 42\nColor: red\n')
# 命名变量,匹配结果放到Result.named 字典中
In : search('Age: {age}\n', 'Name: Rufus\nAge: 42\nColor: red\n')
Out: <Result () {'age': '42'}>
# 将抽取数据格式转换成为数字
In : search('Age: {age:d}\n', 'Name: Rufus\nAge: 42\nColor: red\n')
Out: <Result () {'age': 42}>
2.2.3 findall
功能同 re.findall
In : ''.join(r[0] for r in findall(">{}<", "<p>the <b>bold</b> text</p>"))
Out: 'the bold text'
2.2.4 compile
功能同 re.compile
>>> from parse import compile
>>> p = compile("It's {}, I love it!")
>>> print(p)
<Parser "It's {}, I love it!">
>>> p.parse("It's spam, I love it!")
<Result ('spam',) {}>
3. 总结
使用f-string和parse,来更加优雅的使用渲染和抽取,提高代码的可读性.
f-string == 更简单易用的str.format
parse == 可读性更好的re