阅读 40

Python高效编程技巧笔记(二)字符串处理相关问题与解决技巧

1.如何拆分含有多种分隔符的字符串

实际案例:

我们要把某字符串依据分割符号拆分不同的字段,该字符串包含多种不同的分隔符,例如: s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz' 其中<,>,<;>,<|>,<\t>都是分割符号,如何处理?

解决方案:

方法1:连续使用str.split()方法,每次处理一种分割符号

方法2: 使用正则表达式的re.split()方法,推荐.

s='ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz'
s.split('|,;')
s.split(';')
[ss.split('|') for ss in s.split(';')]
list(map(lambda ss:ss.split('|'),s.split(';')))
t=[]
t.extend([1,2,3])
t.extend([4,5,6])
map(t.extend())
[ss.split('|') for ss in s.split(';')]
sum([ss.split('|') for ss in s.split(';')],[])

def my_split(s,seps):
    res=[s]
    for sep in seps:
        t=[]
        list(map(lambda ss: t.extend(ss.split(sep)),res))
        res=t
    return res
my_split(s,',;|\t')

from functools import reduce
reduce(lambda l, sep:sum(map(lambda ss:ss.split(sep),1),[]),',;|\t',[s]
my_splits== lambda s,seps:reduce(lambda l, sep:sum(map(lambda ss:ss.split(sep),1),[]),seps,[s]

复制代码

2.如何判断字符串a是否以字符串b开头或结尾

研讨问题:

如何判断字符串a是否以字符串b开头或结尾?

实际案例:

某文件目录下有一系列文件:

 quicksort.c
 
 graph.p
 
 heap.java
 
 install.sh
 
 stack.cpp
复制代码

编写程序给其中所有.sh文件和.py文件加上用户可执行权限.

解决方案:

使用str.startswith()str.endswith()方法(注意:多个匹配时参数使用元组)

fn='aaa.py'
fn.endswith('.py')
fn.endswith('.sh','.py')
import os 
os.listdir('.')
s=os.stat('b.py')
s.st_mode|0o100
oct(s.st_mode|0o100)
od.chmod('b.py',s.st_mode |0o100)

import stat
stat.S_IXUSR
for fn in os.listdir():
    if fn.endswith('.py','.sh')
    fs=os.stat(fn)
    os.chmod(fn,fs.st_mode | stat.S_IXUSR)
复制代码

3.如何调整字符串中文本的格式

研讨问题:

如何调整字符串中文本的格式?

实际案例:

某软件的logo文件,其中的日期格式为'yyyy-mm-dd' 我们想把其中日期改为美国日期的格式'mm/dd/yyyy'. 2019-07-23'=>'07/23/2019',如何处理?

解决方案:

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

ls /var/log
cat/var/log/dpkg.log.1
f=open('/var/log/dpkg.log.1')
log=f.read()

import re
re.sub(p,r,s)
print(re.sub(r'(\d{4})-(\d{2})-(\d{2})',r'\2/\3/\1',log))
print(re.sub(r'(?P<d>\d{4})-(?P<m>\d{2})-(?P<y>\d{2})',r'\g<m>/\g<y>',log))

复制代码

4.如何调整字符串将多个小字符串拼接成一个大字符串

研讨问题:

如何将一个小字符串拼接成一个大字符串?

实际案例:

在设计网络程序时,我们自定义了一个基于UDP的网络协议,按照固定次序向服务器传递一系列参数:

hwdetect:   "<0112>"

gxDepthBits:  "<32>"

gxResolution:   "<1024*768>"

gcRefresh:      "<60>""

fullAlpha:  "<1>"

lodDist:    "<100>"

DistCall:    "<500>"
复制代码

在程序中我们将各个参数按次序收集到列表中:

["<0112>","<32>","<1024>","<60>","<1>,"<100.00>","<500.00>"]

最终我们要把各个参数拼接成一个数据进行报送.

"<0112><32><1024><60><1><100><500>"

解决方案:

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

方法二:使用str.join()方法,更加快速的拼接列表中所有字符串.

l=["<0112>"","<32>","<1024>","<60>","<1>,"<100.00>","<500.00>"]
s=''
for x in l:
    s+=x
s.join(iterable)->str
timeit ''.join(l)
timeit reduce(str.__add__,1)
复制代码

5.如何对字符串进行左,右,居中对齐

实际案例:

某个字典存储了一系列属性值: {

   "lodDist":100.00,
    "SmallCull":0.04,
    "DistCull":500.00,
    "trilinear":40,
    "farclip":477,
复制代码

} 在程序中,我们想以工整数的格式将其内容输出,如何处理?

    lodDist:100.00,
    SmallCull:0.04,
    DistCull:500.00,
    trilinear:40,
    farclip:477,
复制代码

解决方案:

方法一:使用字符串的str.ljust(),str.rjust(),str.center()进行左右中对齐》

方法二:使用format方法,传递类似'<20>,'>20','^20'参数完成同样任务.

s='abc'
s.ljust(10)
'abc       '
s.rjust(10)
'       abc'
format(s,'<10')
format(s,'>10')
format(s,'^10')
format(123,'+')
format(-123,'+')
format(-123,'>+10'
format(-123,'=+10')
format(-123,'0=+10')
format(+546,'0=+10')
d={ 'lodDist':100.00,'SmallCull':0.04,'DistCull':500.00,'trilinear':40,'farclip':477,}
w=max(map(len,d.keys()))
for k,v in d.items():
    print(k.ljust(w),':',v)
    
复制代码

6.如何字符串中不需要的字符

研讨问题:

如何去掉字符串不需要的字符?

实际案例:

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

' nick2008@gmail.com'

2.过滤某Windows下编辑文本中的'\r':

'hello world\r\n'

3.去掉文本中的Unicode组合符号:

''ni há,chǐ fán''

解决方案:

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

s='     hellowowd'
s.strip()
s.lstrip()
s.rstrip()

复制代码

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

s2='abc:1234'
s2[:3]+s2[4:]
'abc1234'
复制代码

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

s3='   abc   xyz  '
  s3.replace()
s3=' \t abc \t,xtz'
import re
re.sub('[ \t\n]','',s3)
复制代码

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

s='abc1234xyz'
s.translate({ord('a'):'X'})
s.maketrans('abcxyz','XYZABC')
s.translate(s.maketrans('abcxyz','XYZABC'))
s.translate({ord('a'):None})
复制代码

案例4:

s4='ni há,chǐ fán'
c=á
len(c)
import unicodedata
unicodedata.combining(c[1])
[ord(c) for c in s4 if unicodedata.combining(c)]
dict.formkeys([ord(c) for c in s4 if unicodedata.combining(c)],None)
s4.translate(dict.formkeys([ord(c) for c in s4 if unicodedata.combining(c)],None))
复制代码

字符串的分割,拼接,去空格字符,可以用的方法有split(),replace(),translate(),format(),strip()...

关注下面的标签,发现更多相似文章
评论