Python字符串处理实例详解
Python字符串处理实例详解
一、拆分含有多种分隔符的字符串
1.如何拆分含有多种分隔符的字符串
问题:我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如:
s="ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz"
其中;,|,\t都是分隔符号,如何处理?
方法一:连续使用str.split()方法,每次处理一种分隔符号
s="ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz" defmySplit(s,ds): res=[s] fordinds: t=[] map(lambdax:t.extend(x.split(d)),res) res=t returnres printmySplit(s,';|,\t') 输出: ['ab','cd','efg','hi','jkl','mn','opq','rst','uvw','xyz']
方法二:使用正则表达式的re.split()方法,一次性拆分字符串
importre s="ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz" printre.split(r'[;|,\t]+',s) 输出: ['ab','cd','efg','hi','jkl','mn','opq','rst','uvw','xyz']
二、调整字符串中文本格式
1.如何判断字符串a是否以字符串b开头或结尾
问题:某文件系统目录下有一系列文件:a.py,quicksort.c,stack.cpp,b.sh,编写程序给其中所有.sh文件和.py文件加上用户可执行权限?
解决方案:使用字符串中的str.startswith()和end.startswith()方法(注意:多个匹配时参数使用元组)
In[1]:importos
#列出当前目录以.sh和以.py结尾的文件
In[2]:[namefornameinos.listdir('.')ifname.endswith(('.py','.sh'))]
Out[2]:['b.sh','a.py']
In[3]:importstat
#查看a.py文件权限
In[4]:os.stat('a.py').st_mode
Out[4]:33204
#把文件权限转换成8进制,即为平常看到的权限
In[5]:oct(os.stat('a.py').st_mode)
Out[5]:'0100664'
#更改文件权限,添加一个可执行权限
In[6]:os.chmod('a.py',os.stat('a.py').st_mode|stat.S_IXUSR)
In[7]:ll
total0
-rwxrw-r--1yangyang05月914:48a.py*
-rw-rw-r--1yangyang05月914:48b.sh
-rw-rw-r--1yangyang05月914:48quicksort.c
-rw-rw-r--1yangyang05月914:48stack.cpp
2.如何对字符串中文本的格式进行调整
问题:某软件的log文件,其中日期格式为“yyyy-mm-dd”:
2017-05-0809:12:48statushalf-configuredpasswd:amd641:4.2-3.1ubuntu5.2 2017-05-0809:12:48statusinstalledpasswd:amd641:4.2-3.1ubuntu5.2 2017-05-0809:12:48statusunpackedpasswd:amd641:4.2-3.1ubuntu5.2 2017-05-0809:12:48statusunpackedpasswd:amd641:4.2-3.1ubuntu5.2 2017-05-0809:12:48statushalf-configuredpasswd:amd641:4.2-3.1ubuntu5.2 2017-05-0809:12:48statusinstalledpasswd:amd641:4.2-3.1ubuntu5.2 2017-05-0809:12:48startuppackagesconfigure 09:12:48startuppackagesconfigure
我们想把其中日期改为美国日期的格式"mm/dd/yyyy",2017-05-08==>05/08/2017,应如何处理?
解决方案:使用正则表达式re.sub()方法做字符串替换,利用正则表达式的捕获组捕获每个部分内容,在字符串中调整各个组的捕获顺序。
In[1]:importre
In[2]:log=open('/var/log/dpkg.log').read()
#(\d{4})匹配到4个数字为一个捕获组,其顺序为1。故后面替换用\1放到最后,r是为了防止字符串被转义
In[3]:printre.sub('(\d{4})-(\d{2})-(\d{2})',r'\2/\3/\1',log)
05/08/201709:12:48statusunpackedpasswd:amd641:4.2-3.1ubuntu5.2
05/08/201709:12:48statusunpackedpasswd:amd641:4.2-3.1ubuntu5.2
05/08/201709:12:48statusunpackedpasswd:amd641:4.2-3.1ubuntu5.2
05/08/201709:12:48statushalf-configuredpasswd:amd641:4.2-3.1ubuntu5.2
05/08/201709:12:48statusinstalledpasswd:amd641:4.2-3.1ubuntu5.2
05/08/201709:12:48startuppackagesconfigure
#也可以为每个捕获组起个名称,而不使用默认顺序来处理
In[5]:printre.sub('(?P\d{4})-(?P\d{2})-(?P\d{2})',r'\g/\g/\g',log)
05/08/201709:12:48statusunpackedpasswd:amd641:4.2-3.1ubuntu5.2
05/08/201709:12:48statusunpackedpasswd:amd641:4.2-3.1ubuntu5.2
05/08/201709:12:48statusunpackedpasswd:amd641:4.2-3.1ubuntu5.2
05/08/201709:12:48statushalf-configuredpasswd:amd641:4.2-3.1ubuntu5.2
05/08/201709:12:48statusinstalledpasswd:amd641:4.2-3.1ubuntu5.2
05/08/201709:12:48startuppackagesconfigure
三、字符串拼接
1.如何将多个小字符串拼接成一个大的字符串
问题:在程序中我们将各个参数按次序收集到列表中:["<0112>","<32>","<1024x768>","<60>"],要把各个参数拼接成数据报进行发送"<0112><32><1024x768><60>"
解决方案:
方法一:迭代列表,连续使用“+”操作依次拼接每一个字符串
In[1]:pl=["<0112>","<32>","<1024x768>","<60>"] In[2]:s='' #这种方法会产生许多临时结果,会造成资源的浪费 In[3]:forpinpl: ...:s=s+p ...:prints ...: <0112> <0112><32> <0112><32><1024x768> <0112><32><1024x768><60> In[4]:s Out[4]:'<0112><32><1024x768><60>'
方法二:使用str.join()方法,更加快速的拼接列表中所有字符串
In[5]:''.join(pl) Out[5]:'<0112><32><1024x768><60>'
有个列表l=['abc',123,45,'xyz'],如何让123和45以字符串的方式拼接
In[6]:l=['abc',123,45,'xyz'] #使用生成器表达式,开销比列表表达式小 In[7]:(str(x)forxinl) ...: Out[7]:at0x7fe3cadef550> In[8]:''.join(str(x)forxinl) Out[8]:'abc12345xyz'
四、字符串居中对齐
1.如何对字符串进行左、右、居中对齐
问题:某个字典存储了一系列属性值
{
"loDist":100.0,
"smartCull":0.04,
"farclip":477
}
在程序中想以工整的格式进行输出,如何处理?
解决方案:
方法一:使用字符串的str.ljust(),str.rjust(),str.center()进行,右,居中对齐
方法二:使用format方法,传递类似'<20','>20','^20'参数完成同样任务
In[1]:s='abc'
In[2]:s.ljust(20)
Out[2]:'abc'
In[3]:s.ljust(20,'=')
Out[3]:'abc================='
In[4]:s.center(20)
Out[4]:'abc'
In[5]:format(s,'<20')
Out[5]:'abc'
In[6]:d={
...:"loDist":100.0,
...:"smartCull":0.04,
...:"farclip":477
...:}
In[7]:d.keys()
Out[7]:['loDist','smartCull','farclip']
In[8]:w=max(map(len,d.keys()))
In[9]:forkind:
...:printk.ljust(w),':',d[k]
...:
loDist:100.0
smartCull:0.04
farclip:477
2.去掉不需要的字符串
问题:
1.过滤掉用户输入中前后多余的空白字符:'nick@gmail.com'
2.过滤某windows下编辑文本中的'\r':'helloworld\r\n'
3.去掉文本中的unicode组合符号(音调):u'zǒu'
解决方案:
方法一:字符串strip(),lstrip(),rstrip()方法去掉字符串两端字符
方法二:删除单个固定位置的字符,可以使用切片+拼接的方式
方法三:字符串的replace方法或正则表达式re.sub()方法删除任意位置字符
方法四:字符串translate()方法,可以同时删除多种不同字符
In[1]:s='abc123'
In[2]:s.strip()
Out[2]:'abc123'
In[3]:s.lstrip()
Out[3]:'abc123'
In[4]:s='-----ab+++++'
In[5]:s.strip('-+')
Out[5]:'ab'
In[6]:s='abc:123'
In[7]:s[:3]+s[4:]
Out[7]:'abc123'
In[8]:s='\tabc\t123\txyz'
#去除\t
In[9]:s.replace('\t','')
Out[9]:'abc123xyz'
In[10]:s='\tabc\t123\txyz\ropq\r'
In[11]:importre
#去除\t\r
In[12]:re.sub('[\t\r]','',s)
Out[12]:'abc123xyzopq'
In[13]:s='abc\refg\n\2342\t'
#去除\t\r\n
In[14]:s.translate(None,'\t\r\n')
Out[14]:'abcefg\x9c2'
In[15]:u=u'zǒu'
In[16]:u
Out[16]:u'z\u01d2u'
In[17]:printu.translate({0x01d2:None})
zu
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!