1string对象的split方法只适用于非常简单的字符串分割情形,它不予许有多个分割符或者分隔符周围不确定的空格,所以要用
正则,re.split是十分实用的,可以放任何复杂的正则表达式
line='asdf fjdk;afed,fjek,asdf,foo'
import re
re.split(r'[;,\s]\s*',line)
split返回的都是list....使用split函数时候,需要特别注意的是正则表达式是否包含一个括号捕获分组,如果使用了括号捕获分组,那么匹配的内容也会返回到结果中...
fields=re.split(r'(;|,|\s)\s*',line)fields=re.split(r'(?:;|,|\s)\s*',line)#使用非贪婪返回将匹配的文本去除
2字符串开头或者结尾匹配
str.startswith str.endswith 传入的是tuple,返回的是bool型
[name for name in filename if name.endswith(('.png','.txt'))]any(name.endswith('.ipynb') for name in filename) 返回的是bool
类似的操作可以用切片来...file[-4:]=='.txt'这种也可以用正则,re.match('.txt|.png')但是第一个不大优雅而第二个大材小用
3使用shell通配符匹配字符串
*.py Dat[0-9]*.csv 去匹配文本字符串,fnmatch模块提供了两个函数fnmatch 和fnmatchcase()
**Unixshell木有学过,这个学过了之后再了解...
4字符串匹配和搜索
匹配字面字符串,使用基本的字符串方法就行,str.find str.endswith str.startswith 复杂的正则表达式
match()总是从字符串的开始去匹配,想查找字符串任意部分的模式要使用findall()
findall方法会以搜索文本并以列表的形式返回所有的匹配,如果你想以迭代的方式返回匹配使用finditer()方法来替代..
使用re模块进行匹配和搜索文本的最基本的方法,核心步骤就是先使用re.compile()编译正则表达式字符串,然后使用match,findall或者finditer()
5字符串搜索和替换
简单的字面模式,直接使用str.replace()方法即可...对于复杂的模式,需要使用re模块的sub()函数.
text='Today is 11/27/2012.pyCon starts 3/13/2013.'
import re
re.sub(r'(\d+)/(\d+)/(\d+)',r'\3-\1-\2',text)
\3-\1-\2代表了前面捕获组号..
re.subn()可以知道有多少组替换发生了.......next,n=dataPat.subn(' ',text)来代替
6字符串忽略大小写的搜索替换
flag=re.IGNORECASE标志参数..
re.findall('Python',text,flag=re.IGNORECASE)
7最短匹配模式
(.*?)* *是贪婪的要使用?将整个匹配变成非贪婪模式.
8多行匹配模式
用(.)去匹配任意字符的时候,忘记了点(.)不能匹配换行符的事实 re.compile函数接受一个标志参数叫re.DOTALL,它可以让正则表达式中的点(.)匹配包括换行符在内的任意字符..换行的时候不用这个就需要用\n来匹配
9将Unicode文本标准化
问题:你正在处理Unicode字符串,需要确保所有的字符串在底层有相同的表示
在Unicode中,某些字符能够用多个合法的编码表示..使用Unicodedata模块现将文本标准化
import unicodedata
t=unicodedata.normalize('NFC',str)
11删除字符串中不需要的字符
你想去掉文本字符串的开头,结尾或者中间不想要的字符,比如说空格
strip()用于删除开头或者结尾的字符,lstrip() rstrip()分别是从左和从右删除字符..
12文本清理,可以使用str.upper 或者str.lower使得文本标注化,也可以使用str.replace或者re.sub替换成可以操作的字符串,特可以使用UNICodedata.normalize使其标准化..
可能想消除整个区间的字符或者去除变音符,可以使用经常会被忽略的str.translate()
13使用某种格式化字符串
text='Hello World'
text.ljust(20)
text.rjust(20)
text.center(20)
都可以接受一个填充字符text.center(20,'+')format可以达到同样的效果format(text,'>20')
format(text,'<20')
format(text,'^20')format(text,'+^20s')非空格的+来格式化
format的好处是不仅可以用来处理字符串,
14合并拼接字符串,
如果都是一个iterable使用join最方便如果只是少数几个字符串用+就足够了,但是+会在每次迭代的时候创建一个新的字符串,所以使用生成器写代码比较方便','.join(str for str in data)
with open str as file:file.write( a+b)或者
with open str as file:file.write(a)file.write(b)
当文本较小时,采用第一种,因为I/O系统天生反应就慢,较大的字符使用第二种避免了创建一个很大的临时结果并且要复制大量的内存块数据准备输出大量的小字符串的输出代码,使用生成器yield来产生输出片段..
def sample():yield 'text'
text=''join(sample())
yield的具体..有讲
15字符串中插入变量
Python并么有对在字符串中简单替换变量值提供直接的支持,但还是通过字符串的format()方法来解决这个问题..
s='{name} has {n} messages.'
s.format(name='Guido',n=37)
name='Guido'
n=37
s.format_map(vars())
vars()同样适用于实例对象,vars(Class('name',37))这种
format和format_map的一个缺陷是它们并不能很好的处理变量缺失的情况..一种避免这种错误的方法是另外一个含有__missing__()方法的字典对象..
class safesub(dict):def __missing__(self,key):return '{'+key+'}'
del n
s.format_map(safesub(vars()))
16以指定列宽来格式化字符串的输出
import textwrap
textwrap.fill(str,70)
17在字符串中处理html和XML
替换文本字符串中的'<'或者'>',使用html.escape()函数
from html.parser import HTMLParser
p=HTMLParser()
p.unescape(s)
18字符串令牌解析,有一个字符串,想从左到右将其解析成一个令牌流
#令牌桶算法
import timeclass TokenBucket(object):# rate是令牌发放速度,capacity是桶的大小def __init__(self, rate, capacity):self._rate = rateself._capacity = capacityself._current_amount = 0self._last_consume_time = int(time.time())# token_amount是发送数据需要的令牌数def consume(self, token_amount):increment = (int(time.time()) - self._last_consume_time) * self._rate # 计算从上次发送到这次发送,新发放的令牌数量self._current_amount = min(increment + self._current_amount, self._capacity) # 令牌数量不能超过桶的容量if token_amount > self._current_amount: # 如果没有足够的令牌,则不能发送数据return Falseself._last_consume_time = int(time.time())self._current_amount -= token_amountreturn True
19自动下降算法...估计得后续开个专门的文章来讲,这本书讲的太泛泛,可以看看NLP算法方面的书籍
20字节字符串同样适用于字符串的一些操作,re模块的表达式也需要是同等的.b这种..
p92 chapter four