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"

def mySplit(s,ds):
    res = [s]
    for d in ds:
        t = []
        map(lambda x: t.extend(x.split(d)), res)
        res = t
    return res

print mySplit(s,';|,/t')

输出:
['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz']

方法二: 使用正则表达式的re.split()方法,一次性拆分字符串

import re

s = "ab;cd|efg|hi,jkl|mn/topq;rst,uvw/txyz"

print re.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]: import os

# 列出当前目录以.sh和以.py结尾的文件
In [2]: [name for name in os.listdir('.') if name.endswith(('.py','.sh'))]
Out[2]: ['b.sh', 'a.py']

In [3]: import stat

# 查看 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
total 0
-rwxrw-r-- 1 yangyang 0 5月   9 14:48 a.py*
-rw-rw-r-- 1 yangyang 0 5月   9 14:48 b.sh
-rw-rw-r-- 1 yangyang 0 5月   9 14:48 quicksort.c
-rw-rw-r-- 1 yangyang 0 5月   9 14:48 stack.cpp

2.如何对字符串中文本的格式进行调整

问题: 某软件的log文件,其中日期格式为“yyyy-mm-dd”:

2017-05-08 09:12:48 status half-configured passwd:amd64 1:4.2-3.1ubuntu5.2
2017-05-08 09:12:48 status installed passwd:amd64 1:4.2-3.1ubuntu5.2
2017-05-08 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
2017-05-08 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
2017-05-08 09:12:48 status half-configured passwd:amd64 1:4.2-3.1ubuntu5.2
2017-05-08 09:12:48 status installed passwd:amd64 1:4.2-3.1ubuntu5.2
2017-05-08 09:12:48 startup packages configure
09:12:48 startup packages configure

我们想把其中日期改为美国日期的格式”mm/dd/yyyy”,2017-05-08 ==> 05/08/2017 ,应如何处理?

解决方案:使用正则表达式re.sub()方法做字符串替换,利用正则表达式的捕获组捕获每个部分内容,在字符串中调整各个组的捕获顺序。

In [1]: import re

In [2]: log = open('/var/log/dpkg.log').read()
# (/d{4}) 匹配到4个数字为一个捕获组,其顺序为1。故后面替换用/1放到最后,r是为了防止字符串被转义
In [3]: print re.sub('(/d{4})-(/d{2})-(/d{2})',r'/2//3//1', log)
05/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status half-configured passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status installed passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 startup packages configure

# 也可以为每个捕获组起个名称,而不使用默认顺序来处理
In [5]: print re.sub('(?P<year>/d{4})-(?P<month>/d{2})-(?P<day>/d{2})',r'/g<month>//g<day>//g<year>', log)
05/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status half-configured passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status installed passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 startup packages configure

三、字符串拼接

1.如何将多个小字符串拼接成一个大的字符串

问题:在程序中我们将各个参数按次序收集到列表中:
[“<0112>”, “<32>”,”<1024×768>”,”<60>” ],要把各个参数拼接成数据报进行发送”<0112><32><1024×768><60>”

解决方案:

方法一:迭代列表,连续使用“+”操作依次拼接每一个字符串


In [1]: pl = ["<0112>", "<32>","<1024x768>","<60>" ]

In [2]: s = ''

# 这种方法会产生许多临时结果,会造成资源的浪费
In [3]: for p in pl:
   ...:     s = s + p
   ...:     print s
   ...:     
<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) for x in l)
   ...: 
Out[7]: <generator object <genexpr> at 0x7fe3cadef550>

In [8]: ''.join(str(x) for x in l)
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]: for k in d:
   ...:     print k.ljust(w),':',d[k]
   ...:     
loDist    : 100.0
smartCull : 0.04
farclip   : 477

2.去掉不需要的字符串

问题:

1.过滤掉用户输入中前后多余的空白字符: ‘ nick@gmail.com ‘

2.过滤某windows下编辑文本中的’/r’: ‘hello world/r/n’

3.去掉文本中的unicode组合符号(音调):u’zǒu’

解决方案:

方法一: 字符串strip(),lstrip(),rstrip()方法去掉字符串两端字符

方法二:删除单个固定位置的字符,可以使用切片+拼接的方式

方法三:字符串的replace方法或正则表达式re.sub()方法删除任意位置字符

方法四:字符串translate()方法,可以同时删除多种不同字符

In [1]: s = '  abc 123  '

In [2]: s.strip()
Out[2]: 'abc 123'

In [3]: s.lstrip()
Out[3]: 'abc 123  '

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]: import re
# 去除/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]: print u.translate({0x01d2:None})
zu

【转自慕课】https://www.imooc.com

Python

Python变量的类型学习

2022-3-3 7:30:48

Python

python闭包:确保引用的局部变量在函数返回后不能变

2022-3-3 7:36:52

搜索