一、使用多个界定符分割字符串

字符串.split(',')形式只适用于单一分割符的情况;多分割符同时应用的时候,可使用re.split()

>>> line = 'asdf fjdk; afed, fjek,asdf, foo'
>>> import re
>>> re.split(r'[;,\s]\s*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

>>> re.split(r'(?:;,\s)\s*', line) #须用非捕获形式,否则各个分割符也将出现在列表中
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

二、字符串开头或结尾匹配

  • 思路1:.startswith(str或tuple)、.endswith(str或tuple),用元组形式可匹配多项
  • 思路2:切片之后进行对比
  • 思路3:使用正则表达式,re.match(r'patterns', str)、re.search(r'patterns$', str)

三、字符串匹配和搜索:re模块,应用正则表达式

  re核心步骤就是先使用 re.compile() 编译正则表达式字符串, 然后使用match() , findall() 或者 finditer() 等方法以提高效率;捕获分组可以使得后面的处理更加简单,因为可以分别将每个组的内容提取出来:

>>> datepat = re.compile(r'(\d+)/(\d+)/(\d+)')
>>>
>>> m = datepat.match('11/27/2012')
>>> m
<_sre.SRE_Match object at 0x1005d2750>
>>> # Extract the contents of each group
>>> m.group()或m.group(0)
'11/27/2012'
>>> m.group(1)
''
>>> m.group(2)
''
>>> m.group(3)
''
>>> m.groups() #元组形式列出各分组的值
('', '', '')

findall() 方法会搜索文本并以列表形式返回所有的匹配,如果想以迭代方式返回匹配,可以使用 finditer() 方法来代替

>>> for m in datepat.finditer(text):
... print(m.groups())
...
('', '', '')
('', '', '')
>>>

四、查找和替换文本

  .replace:效率高,每次只能替换一个字符串;re.sub()/re.subn(),后者返回替换后的结果及替换的次数;.strip('=')/.lstrip('*')/.rstrip(' ')可用于支除字符串两端、左端、右端的指定字符

  常用到捕获分组形式\N:

>>> re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', '11/27/2016')
'2016-11-27'
>>> re.subn(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', '11/28/2016')
('2016-11-28', 1)

  对于更加复杂的情况,可指定一个替换回调函数对分组数据进行处理及格式化:

#!/usr/bin/env python3
#-*- coding=utf-8 -*-
import re
from calendar import month_abbr
yourdate = input('请输入日期dd/mm/yyyy: ')
m = re.search(r'(\d+)/(\d+)/(\d+)', yourdate)
datepat = re.compile(r'(\d+)/(\d+)/(\d+)') def mon_ch(m):
mon_name = month_abbr[int(m.group(2))]
return '{:=^10} {:-<5} {:*>8}'.format(m.group(3), mon_name, m.group(1)) #format可作用于任何值,不仅是str print(datepat.sub(mon_ch(m), yourdate))

五、 不区分大小写及多行查找、替换

  • re.findall(r'', yourtext, flags=re.I|re.M)    #多个flags用|连接
  • re.M 或用 \n|. 替换 . 即可实现多行匹配,后者适用性更强

六、字符串连接、合并

  优选print('', '', '', sep=':'),其次print(':'.join(str(x) for x in data)),最次使用连接符+;

七、处理字符串中的变量(名转换为值)

  Python不支持在字符串中对变量做简单的值替换,可通过format_map()、vars()实现,vars()或locals()是一个显示本地变量与其值的映射表(dict);

test = 'my name is {name}!'
name = input('请输入你的姓名:')
'Jack'
test.format_map(vars())
'my name is Jack!'

Python3 From Zero——{最初的意识:002~字符串和文本}的更多相关文章

  1. Python3 From Zero——{最初的意识:000~Initial consciousness}

    http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 a.编码 默认情况下,Python ...

  2. Python3 From Zero——{最初的意识:008~初级实例演练}

    一.构显国际橡棋8x8棋盘 #!/usr/bin/env python3 #-*- coding:utf-8 -*- color_0="\033[41m \033[00m" col ...

  3. Python3 From Zero——{最初的意识:006~数据编码与处理}

    一.读写CSV数据: #!/usr/bin/env python3 #-*- coding=utf8 -*- import csv with open('kxtx.csv', 'rt') as f: ...

  4. Python3 From Zero——{最初的意识:001~数据结构和算法}

    一.从队列两端高效插入.删除元素,及保留固定数量的数据条目: collections.deque([iterable[,maxlen=N]]) a = collections.deque([1, 2] ...

  5. Python3 From Zero——{最初的意识:007~函数}

    一.编写可接受任意数量参数的函数:*.** >>> def test(x, *args, y, **kwargs): ... pass ... >>> test(1 ...

  6. Python3 From Zero——{最初的意识:005~文件和I/O}

    一.输出重定向到文件 >>> with open('/home/f/py_script/passwd', 'rt+') as f1: ... print('Hello Dog!', ...

  7. Python3 From Zero——{最初的意识:004~迭代器和生成器}

    一.反向迭代:reversed() >>> a [1, 2, 3, 4] >>> for x in reversed(a): ... print(x, end=' ...

  8. Python3 From Zero——{最初的意识:003~数字、日期、时间}

    一.对数值进行取整:round(value,ndigits) >>> round(15.5,-1) #可以取负数 20.0 >>> round(15.5,0) #当 ...

  9. [转]python3字符串与文本处理

    转自:python3字符串与文本处理 阅读目录 1.针对任意多的分隔符拆分字符串 2.在字符串的开头或结尾处做文本匹配 3.利用shell通配符做字符串匹配 4.文本模式的匹配和查找 5.查找和替换文 ...

随机推荐

  1. bzoj1044题解

    [题意分析] 本题等价于如下描述: 有一个长度为n的正整数序列,要求将其分解成m+1个子串,使最大子串和最小.求这个最大子串和及对应的分解方案数. [解题思路] 第一问二分+贪心即可.容易证明对于确定 ...

  2. django_websocket实现简单聊天室

    一.安装模块 pip install channels pip install channels-redis 二.代码 #websocket_v1/settings.py INSTALLED_APPS ...

  3. 20165239 2018——2019Exp8 Web基础

    Exp8 Web基础 基础问题回答 (1)什么是表单 •表单在网页中主要负责数据采集功能. •一个表单有三个基本组成部分: ◦表单标签,这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务 ...

  4. robotframework悬浮菜单定位问题

      有些菜单是悬浮菜单,鼠标点上去下级元素才会显示.比如在第一个菜单中选择后会触发二级菜单的某事件,触发二级菜单又去点三级菜单.. 最开始就用click element去点击了,可是菜单会缩回去,就有 ...

  5. java中的javap命令(工作中补充的知识)

    背景: 上周针对某信得压力测试demo进行场景复现,但是只提供了class文件,只能通过反编译的软件进行查看,在复现的过程中报错某某某行,这里我以xx行代替,因为是class文件,所以并不能确定具体到 ...

  6. EF 线程内唯一对象

    ef 做了很多修改后一起提交 增 删 改查 也就是相应的操作后不提交最后一起提交 在Dal层创建一个 EF上下文工厂 public class DBContextFactory { public st ...

  7. USACO Running Away From the Barn /// 可并堆 左偏树维护大顶堆

    题目大意: 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于m的点有多少个 左偏树 https://blog.csdn.net/pengwill97/article/details/82 ...

  8. 2018湘潭大学程序设计竞赛【E】

    题目链接:https://www.nowcoder.com/acm/contest/105/E 题意:给你美食种类和查询次数,告诉你美味度和价格,给你固定钱数,问你最多能吃到多少美味度的食物.(X真是 ...

  9. ios网络学习------2 用非代理方法实现同步post请求

    #pragma mark - 这是私有方法,尽量不要再方法中直接使用属性,由于一般来说属性都是和界面关联的,我们能够通过參数的方式来使用属性 #pragma mark post登录方法 -(void) ...

  10. fedora 28 winscp链接不上

    systemctl restart sshd.service //启动sshd服务 systemctl stop firewalld //关闭防火墙 /etc/selinux/config //关闭s ...