当前位置: 首页 > news >正文

Python字符串处理实例详解

Python字符串处理实例详解

一、拆分含有多种分隔符的字符串

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

问题: 我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如:

1

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

其中;,|,\t 都是分隔符号,如何处理?

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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()方法,一次性拆分字符串

1

2

3

4

5

6

7

8

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()方法 (注意:多个匹配时参数使用元组)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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--1yangyang05914:48a.py*

-rw-rw-r--1yangyang05914:48b.sh

-rw-rw-r--1yangyang05914:48quicksort.c

-rw-rw-r--1yangyang05914:48stack.cpp

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

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

1

2

3

4

5

6

7

8

2017-05-0809:12:48status half-configured passwd:amd641:4.2-3.1ubuntu5.2

2017-05-0809:12:48status installed passwd:amd641:4.2-3.1ubuntu5.2

2017-05-0809:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.2

2017-05-0809:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.2

2017-05-0809:12:48status half-configured passwd:amd641:4.2-3.1ubuntu5.2

2017-05-0809:12:48status installed passwd:amd641:4.2-3.1ubuntu5.2

2017-05-0809:12:48startup packages configure

09:12:48startup packages configure

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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:48status unpacked passwd:amd641:4.2-3.1ubuntu5.2

05/08/201709:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.2

05/08/201709:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.2

05/08/201709:12:48status half-configured passwd:amd641:4.2-3.1ubuntu5.2

05/08/201709:12:48status installed passwd:amd641:4.2-3.1ubuntu5.2

05/08/201709:12:48startup packages configure

# 也可以为每个捕获组起个名称,而不使用默认顺序来处理

In [5]:printre.sub('(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})',r'\g<month>/\g<day>/\g<year>', log)

05/08/201709:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.2

05/08/201709:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.2

05/08/201709:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.2

05/08/201709:12:48status half-configured passwd:amd641:4.2-3.1ubuntu5.2

05/08/201709:12:48status installed passwd:amd641:4.2-3.1ubuntu5.2

05/08/201709:12:48startup packages configure

三、字符串拼接

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

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

解决方案:

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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()方法,更加快速的拼接列表中所有字符串

1

2

In [5]: ''.join(pl)

Out[5]:'<0112><32><1024x768><60>'

有个列表l = ['abc',123,45,'xyz'],如何让123和45以字符串的方式拼接

1

2

3

4

5

6

7

8

9

In [6]: l=['abc',123,45,'xyz']

# 使用生成器表达式,开销比列表表达式小

In [7]: (str(x)forxinl)

...:

Out[7]: <generatorobject<genexpr> at0x7fe3cadef550>

In [8]: ''.join(str(x)forxinl)

Out[8]:'abc12345xyz'

四、字符串居中对齐

1.如何对字符串进行左、右、居中对齐

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

1

2

3

4

5

{

"loDist":100.0,

"smartCull":0.04,

"farclip":477

}

在程序中想以工整的格式进行输出,如何处理?

解决方案:

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

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': 'hello world\r\n'

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

解决方案:

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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]: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

复制讲解


感谢阅读,希望能帮助到大家

http://www.jsqmd.com/news/697146/

相关文章:

  • 软件产品中的用户体验设计原则
  • VSCode连接WSL2写C++代码,这几个调试和编译的‘骚操作’让你效率翻倍
  • 在Vivado里用STARTUPE3原语驱动S25FL256S Flash,手把手教你读写配置(附完整代码)
  • BetterNCM安装器完整指南:3分钟为网易云音乐添加插件功能
  • FPGA时序硬件事务设计与Cement2框架解析
  • 浅谈:人类创造的两种类型的语言
  • 成都还有这么高性价比的GEO服务公司,究竟哪家好? - 品牌推荐官方
  • 英雄联盟客户端个性化定制:5分钟打造你的专属游戏界面
  • HC-SR04测距不准?可能是你的STM32代码时序没调好!一份超详细的避坑调试指南
  • 深入理解ILI9341:通过STM32F4玩转TFTLCD的显存、指令与扫描方向
  • 抖音无水印下载工具终极指南:三步解决内容保存难题
  • 2026年Q2最新色母粒厂家全国排名推荐:专业塑胶色母粒厂家权威推荐TOP5 - 安互工业信息
  • 华为交换机Console密码忘了别慌!BootLoad菜单里这个选项能救急(附完整操作截图)
  • AI调试失败率下降68.4%——基于217个真实项目日志的VSCode AI调试异常模式图谱(含自动归因脚本开源)
  • 永辉超市购物卡快速回收,方法简单收益高! - 团团收购物卡回收
  • 树莓派4B+USB摄像头,5分钟搞定你的第一个人脸识别程序(附完整代码)
  • 粒子模拟(PIC)方法:原理、挑战与应用实践
  • 保姆级教程:在ROS2 Humble上从源码编译运行VoxelMap(解决常见依赖与编译错误)
  • 别再只盯着杀毒软件了!从端口、注册表和网络流量三个维度,手把手教你手动排查Windows系统中的木马痕迹
  • 避坑指南:Autosar网络管理唤醒失败?从EcuM_CheckWakeup到ComM通道激活的链路排查
  • FigmaCN:3步让Figma界面说中文,设计师的语言障碍终结者
  • 终极解决方案:biliTickerBuy - B站会员购抢票神器完整使用指南
  • P4877 [USACO14FEB] Cow Decathlon G
  • SAM-Track:多模态交互与自动跟踪,解锁视频分割新范式
  • 抖音内容批量下载终极指南:免费开源工具解决无水印保存难题
  • 别再只用原生Swiper了!手把手教你用WXML+CSS+JS实现微信小程序堆叠卡片轮播
  • C++26反射编译期加速实战:如何将模板元编程吞吐量提升470%?实测Clang 19.0.1+MSVC v144数据
  • 如何一键捕获完整网页截图:Chrome扩展终极指南
  • 2026 年肇庆物流线路推荐榜:高效专线与靠谱运力,企业发货更省心 - 品牌企业推荐师(官方)
  • 告别死记硬背:用‘红绿灯’和‘排队’模型秒懂AXI的Outstanding与乱序