Python

1-text模块

2019-01-15  本文已影响0人  神秘加冰

概述

str 无疑是python最常用的字符串处理模块,除此之外还有一些补充 str 功能的第三方模块
比如 string 模块,有template函数,有一些字符串属性
比如 re 模块,主要用于字符串的匹配

str 模块

可以直接使用 help(str) 查看其支持的函数

s = "hello world"
print(s.capitalize())
print(s.casefold()) 
print(s.count('h')) # 1
print(s.find('llo')) #2
print(s.index('lo')) # 3
print(s.join(['john','www'])) # johnhello worldwww
print(s.replace('lo','rl'))
print(s.splitlines())
print(s.title()) # 首字母大写
print(s.zfill(10))
print(s.strip()) 
print(s.lower())
print(s.upper())

爬虫的时候,如果遇到需要转码的时候,可以使用

'\\u0062'.encode('utf-8').decode('unicode-escape')

string 模块

string模块主要使用的还是其template的功能,一个简单的例子:

values = {'var':'foo'}
t = string.Template("""
Variable : $var
Escape : $$
Variable in text : ${var}iable
""")
# $var 变量
# $$ 如果要输出 $,要用$进行转义
# ${var} 变量
print("Templates:",t.substitute(values))

可以看到template处理的是多行字符串,但是这个在 str 模块,也可以使用format来进行转换,所以并没有什么卵用,如果只是格式化输出字符串,不管多行还是单行,使用 format,才是最简单方便的做法

# 结合format 进行使用
t2 = """
Variable : {var}
Escape : {{}}
Variable in text : {var}iable
"""
print("format: ",t2.format(**values))

除此之外,Template 还存在高级的功能,可以通过自定义规则,来实现一个字符串中,有的格式化,有的不格式化.当然个人感觉也没有什么用。只做一个了解


class MyTemplates(string.Template):
    delimiter = '%'
    idpattern = '[a-z]+_[a-z]+'

text = """
replaced: %need_replace
ignored: %ignored
"""
d = {
    'need_replace': "Haha replaced",
    "ignored": "hh ignored"
}
t = MyTemplates(text)
print(t.safe_substitute(d))

经过上面的实验,string这个模块可有可无,但是string 还提供了一些属性倒是可以方便我们写代码的时候引用,你可以使用

ascii_letters='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
ascii_lowercase='abcdefghijklmnopqrstuvwxyz'
ascii_uppercase='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
digits='0123456789'
hexdigits='0123456789abcdefABCDEF'
octdigits='01234567'
printable='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
punctuation='!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
whitespace=' \t\n\r\x0b\x0c'

比如你想写一个程序,随机生成高强度代码,那么你就可以使用下面的属性,很方便的写出来

import random
def generate_passwd():
    uppercase_wd =random.choices(string.ascii_uppercase,k=random.randint(3,6)) 
    lowercase_wd = random.choices(string.ascii_lowercase,k=random.randint(3,6))
    digits_wd = random.choices(string.digits,k=random.randint(3,6))
    punctuation_wd = random.choices('!@#$%^&*()[<>?]',k=random.randint(3,6))
    a = uppercase_wd+lowercase_wd+digits_wd+punctuation_wd
    random.shuffle(a)
    print(''.join(a))

re 模块

正则表达式的写法在网上一搜一大堆,可以集合一些比较常用的,需要的时候可以省去搜索的时间。
python中的re模块一共有以下几种函数可以使用

re.search(pattern,string,flags=0)

搜索所有的字符串,匹配到内容返回,否则返回None

import re
text = 'I have an pen 1234'
s = re.search('.*?(\d+)',text,re.I)
print(s.group(0))
print(s.group(1))

re.match(pattern,string,flags=0)

只匹配开头就符合的字符串, 如果不是开头第一个字符就符合,返回None

import re
s = re.match('I(.*)',text,re.I)
print(s.group(0))
print(s.group(1))

re.split(pattern,string,maxsplit=0,flags=0)

根据正则切割字符串

>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
['0', '3', '9']

re.findall(pattern,string,flags=0)

找到符合的字符串,返回一个列表

text = 'I have an pen 1234'
s = re.findall('\w+',text,re.I)
print(s) # ['I', 'have', 'an', 'pen', '1234']

re.sub(pattern,replace_content,string,count=0,flags=0)

替换字符串,返回一个字符串

s = re.sub('have',"Hello",text,re.I)
print(s) # I Hello an pen 1234

这里有一个count,如果count = n 意思是如果找到多个可替换的字符,只替换前n个

s = re.sub('have',"Hello",text,flags=re.I,count=1)
print(s) # I Hello an  have pen 1234

re.subn(pattern,repl,string,count=0,flags=0)

替换字符,但是返回的式tuple

s = re.subn('have',"Hello",text,re.I)
print(s) # ('I Hello an  Hello pen 1234', 2)

re.escape(pattern)

返回一个转义的字符

>>> print(re.escape('python.exe'))
python\.exe

参考

《The Python3 Standard Library By Example》
常见的正则表达式: https://juejin.im/entry/5686056160b2e495ddd8b9a5

上一篇下一篇

猜你喜欢

热点阅读