Python模块:Re模块、附软件开发目录规范
Re模块:(正则表达式)
正则表达式就是字符串的匹配规则
正则表达式在多数编程语言里都有相应的支持,Python里面对应的模块时re
常用的表达式规则:(都需要记住)
“ . ” # 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
“ ^ ” # 匹配字符开头,
若指定flags MULTILINE,这种也可以匹配上("^a","\nabc\neee",flags=re.MULTILINE)(即:如果flags指定了 re.MULTILINE, 每一行都会尝试去匹配)
“ $ ” # 匹配字符结尾,若指定flags MULTILINE ,re.search('foo.$','foo1\nfoo2\n',re.MULTILINE).group() 会匹配到foo1。 (如果flags指定了 re.MULTILINE, 每一行都会尝试去匹配)
“ * ” # 匹配*号前的字符0次或多次, re.search('a*','aaaabac') 结果'aaaa'; # ab* will match ‘a’, ‘ab’, or ‘a’ followed by any number of ‘b’s.
“ + ” # 匹配“+”前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb'] # ab+
will match ‘a’ followed by any non-zero number of ‘b’s; it will not match just ‘a’.
“ ? ” # 匹配“?”前一个字符1次或0次 ,re.search('b?','alex').group() 匹配b 0次 # ab?
will match either ‘a’ or ‘ab’.
“ {m} ” # 匹配前一个字符m次 ,re.search('b{3}','alexbbbs').group() 匹配到'bbb'
“ {n,m} ” # 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果['abb', 'ab', 'abb']
“ [ ] ” # Used to indicate a set of characters. 在[ ] 中的字符, 可以单独列出来(如:[abc123]),也可以用“-”表示一个范围(如:[0-9])
“ | ” # 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
“ ( ... ) ” # 分组匹配; 利用 .groups() 查看分开后的匹配结果(元祖形式)(涉及到分组就用. groups())
注:以上的全部都经常使用
“ \A ” # 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的,相当于re.match('abc',"alexabc") 或re.search('^abc', 'xxx')
“ \Z ” # 匹配字符结尾, 同$
“ \d ” # 匹配数字0到9, 相当于[0-9](经常使用) # re.search('\d+', string) # 贪婪匹配模式
“ \D ” # 匹配非数字 (经常使用)
“ \w ” # 匹配[A-Za-z0-9] (即非特殊字符) (经常使用)
“ \W ” # 匹配非[A-Za-z0-9] (即特殊字符) (经常使用)
“ \s ” # 匹配空白字符、\n、\t、\r ;
“ (?P<name>...) ” # 分组匹配 ; 举例如下:
import re id_s = '130704200005251653' res = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})',id_s) print(res.group()) print(res.groups()) # 涉及到分组就用 groups# 以字典的形式输出 print(res.groupdict())# 打印结果: # 1307042000 # ('130', '704', '2000') # {'province': '130', 'city': '704', 'born_year': '2000'}
re的匹配语法有以下几种:
- re.match(pattern,string,flags=0) # 从头开始匹配;检测字符串的第一个元素是否匹配你所设置的pattern,后面的元素不再检测是否匹配,并返回匹配到的元素或者“None” # 官方解释:
If zero or more characters at the beginning of string match the regular expression pattern, return a corresponding match object. Return
None
if the string does not match the pattern; note that this is different from a zero-length match.Note that even in
MULTILINE
mode,re.match()
will only match at the beginning of the string and not at the beginning of each line.If you want to locate a match anywhere in string, use
search()
instead - re.search(pattern,string,flags=0) # 遍历整个字符串找到第一个匹配你pattern的元素,后面的元素不再检测是否匹配,并返回匹配到的元素或者“None” # 官方解释: Scan through string looking for the first location where the regular expression pattern produces a match, and return a corresponding match object. Return
None
if no position in the string matches the pattern; note that this is different from finding a zero-length match at some point in the string. - re.findall(pattern, string,flags=0) # 把所有匹配到的字符(元素)放到以列表中的元素返回 # 官方解释: Return all non-overlapping matches of pattern in string, as a list of strings. The string is scanned left-to-right(从左向右扫描字符串匹配), and matches are returned in the order found. If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result.
下面看下re.match()和 re.search()的运行效果:
import re s = '1ab2c3'print(re.search('[0-9]',s)) print(re.match('[0-9]',s))# 打印结果: # <_sre.SRE_Match object; span=(0, 1), match='1'> # <_sre.SRE_Match object; span=(0, 1), match='1'> # search 和match返回的是一个对象, 不是匹配到的值。# 要得到匹配到的值,可以利用 .group(),但需要先判断是否存在,因为如果没有匹配到就用.group()程序会报错 res_match = re.search('[0-9]',s)if res_match: # 先进行判断print(res_match.group())# 打印结果: # 1
- re.split(pattern, string, maxsplit=0,flags=0) # 以匹配到的字符作为分隔符(正则表达式可以用来做模糊匹配)
情况1: import re s = 'neo22alex18#mike-oldboy' print(re.split('\d+|#|-',s)) # pattern:按照 \d+ 或者“#” 或者 - 去split# 输出结果: # ['neo', 'alex', '', 'mike', 'oldboy'] # 第3个空元素是因为18split之后 “#”也split, 成了空元素 # 上面是利用管道符“|”去定义pattern,下面利用[]去定义
import res = 'neo22alex18#mike-oldboy'print(re.split('[\d+#-]',s)) # []就表示里面的都包括,效果就跟“|”类似,但有区别(代码中要注意[]和|具体用哪种), 这个例子只是想强调“[]就表示里面的都包括”这个知识点
# 输出结果:# ['neo', '', 'alex', '', '', 'mike', 'oldboy'] # \d+没有当做一个整体去split,而是分成了\d和字符“+”去split, 我也还没想清楚为什么。。。 情况2:
import res = 'neo22alex18|mike-oldboy' # 假如要求以“|”为分隔符 print(re.split('\|',s)) # | 也是一个语法, 假如你在pattern不想让它作为语法、而是作为字符来使用, 就在它前面加一个斜杠“\” # 输出结果: # ['neo22alex18', 'mike-oldboy'] # 如果想把斜杠“\”当做字符而不是语法来使用, 就在这个“\”后面再加3个“\”, 即总共4个“\” (不理解原因,先记住吧)
import res = 'neo22alex18\mike-oldboy'print(re.split('\\\\',s))
# 输出结果:# ['neo22alex18', 'mike-oldboy']
- re.sub(pattern, repl, string, count=0,flags=0) # 匹配字符并替换
import re s = 'neo22alex18\mike-oldboy' print(re.sub('\d+','+',s))# 输出结果: # neo+alex+\mike-oldboy
- re.fullmatch(pattern, string,flags=0) # 全部匹配: 整个字符串匹配
re.fullmatch('\w+@\w+\.(com|cn|edu)',"alex@oldboyedu.cn") # com|cn|edu 是一组的 , 需要放到一个括号里面 # 输出结果: # <_sre.SRE_Match object; span=(0, 17), match='alex@oldboyedu.cn'>
- re.compile(pattern, flags=0) # 用于编写一个匹配规则(pattern) # 如果你这个pattern要用很多次,可以利用compile先把pattern设置好, 以后直接调用就行; 不像 re.match(pattern, string) 这类的语句Python需要每次先对pattern编译,compile的pattern Python只需要编译一次以后直接调用就行。如下:
Compile a regular expression pattern into a regular expression object, which can be used for matching using its match(), search() and other methods, described below.The sequenceprog = re.compile(pattern) result = prog.match(string)is equivalent toresult = re.match(pattern, string)but using re.compile() and saving the resulting regular expression object for reuse is more efficient when the expression will be used several times in a single program.
Flag标识符:
- re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
- M(MULTILINE): 多行模式,改变'^'和'$'的行为
- S(DOTALL): 改变'.'的行为:make the '.' special character match any character at all, including a newline(换行); without this flag, '.' will match anything except a newline. (换行符也包括在内)
X(re.VERBOSE) 可以给你的表达式写注释,使其更可读,下面这2个意思一样
a = re.compile(r"""\d + # the integral part\. # the decimal point\d * # some fractional digits""", re.X)b = re.compile(r"\d+\.\d*")
软件开发目录规范:
规范化的目录结构能更好的控制程序就够,让程序具有更高的可读性。
“项目目录规范”其实也属于“可读性和可维护性”的范畴,设计层次清晰的目录结构就是为了达到以下两点:
1. 可读性高: 不熟悉这个项目代码的人,一眼就能就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等,从而非常快速的了解这个项目
2. 可维护性高: 定义好组织规则后,维护着就能明确的知道,新增的哪个文件和代码应该放在什么目录下。这个的好处是,随着代码/配置的规模增加,项目结构不会混乱,仍然能组织良好。
通常一个项目都会有的目录如下:
luffy # 建议全小写
log # 日志目录
conf/config/settings # 配置文件目录
libs/modules # 第三方库目录
core/luffy # 程序代码目录/核心代码目录
docs # 文档库
README # 对软件的说明
setup.py # 快速安装
bin # 程序的启动脚本/程序的入口
luffy_server.py
README的写法:
- 软件定位,软件的基本功能。
- 运行代码的方法: 安装环境、启动命令等。
- 简要的使用说明。
- 代码目录结构说明,更详细点可以说明软件的基本原理。
- 常见问题说明。
关系目录规范的详情可参考: https://www.luffycity.com/python-book/di-4-zhang-python-ji-chu-2014-chang-yong-mo-kuai/ruan-jian-kai-fa-mu-lu-gui-fan.html
转载于:https://www.cnblogs.com/neozheng/p/8436453.html
Python模块:Re模块、附软件开发目录规范相关推荐
- 7.16模块及软件开发目录规范
模块 1.什么是模块? 就是一系列功能的结合体 2.模块的三种来源 (1)内置的(python解释器自带) (2)第三方的(别人写的) (3)自定义的(你自己写的) 3.模块的四种表现 (1)使用py ...
- Python 编程规范和软件开发目录规范的重要性
文章目录 1 编程规范的重要性 1.1 注释 Python 中的特殊注释 1.2 规范命名变量: 1.2.1 变量定义规则: 1.2.2 变量规范命名注意事项: 1.2.3 总体命名规则: 1.3 排 ...
- python软件开发目录_软件开发目录规范
为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要.软件的目录规范并无硬性标准,只要清晰可读即可,假设你的软件名为foo,笔者推荐目录结构如下 Foo/ |- ...
- 模块简介/模块的导入/模块的查找顺序/绝对导入和相对导入/软件开发目录规范...
一.模块的简介 什么是模块: 模块就是一系列功能的结合体 模块的三种来源: 1.内置的 2.第三方的 3.自定义的 模块的四种表现形式: 1.使用python编写的py文件(也就意味着py文件也可以称 ...
- Python入门之软件开发目录规范
本章重点: 理解在开发人标准软件时,如何布局项目目录结构,以及注意开发规范的重要性. 一.为什么要有好的目录结构 二.目录组织的方式 三.关于README的内容 四.关于requirements.tx ...
- 软件开发编码规范_如果您只喜欢编码,请不要成为软件开发人员
软件开发编码规范 If you are starting now or thinking about to start a software development career. Or even i ...
- 华为软件开发行为规范
https://wenku.baidu.com/view/3696dec3534de518964bcf84b9d528ea81c72f3f.html https://www.cnblogs.com/z ...
- ui设计和python哪个容易学_软件开发和ui设计那个容易学?
感谢邀请,以下是我的一些亲身经历,想和大家分享. 真心的!建议哪怕是念完一个普通高中,也比现在直接去学那些职业技能要好,学历高一点,你面对的选择.能做的选择也会更多一些,能够拓宽你未来的职业路. 初中 ...
- 软件开发---全套规范
前不久发东软C#开发规范的时候有网友留言说想要其他的开发规范,今天给发些上来 全套的规范,要的赶快下哦,呵呵 点击这里下载 压缩包内容包括: 1.操作手册编写规范.doc 2 ...
最新文章
- 一文看清这些年自监督和无监督的进展
- 九十五、二叉树的递归和非递归的遍历算法模板
- php写新闻浏览历史,PHP实现浏览历史记录
- git lfs的安装和使用详细案例
- SAP Spartacus Static Multi-Site Configuration
- Sublime优美设置(待续)
- 如何让apache支持3gp下载
- java 泛型 `List<Object>` 和`List<String>`
- 安装Windows 10 V1909对CPU有什么要求?
- 【codevs1116】四色问题
- Java 设计模式 之 模板方法模式(Template Method)
- 一文深度揭秘3GPP:2G/3G/4G/Pre-5G标准化制定流程是这样的
- Android控件详解之网格控件
- 电脑不停自动安装垃圾软件怎么办
- 社交类App如何防范黑产垃圾用户?
- python如何问问题_学会正确的提问
- 聊一聊我们应该如何有效学习
- 群晖nas使用的端口
- ffmpeg_Cropping Video(剪裁视频)
- JavaSwing多线程小游戏雷霆战机
热门文章
- 给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,然后B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明。求最后获胜者的分数
- 微服务是去ESB总线、去中心化和分布式
- 北京丁丁租房招聘JAVA开发人员
- [教你做小游戏] 用86行代码写一个联机五子棋WebSocket后端
- cifs挂载 mount ubuntu_如何挂载CIFS共享?
- everything changes so quietly
- python launcher卸载后蓝屏_大毒瘤!卸载WeGame解决XPS 15蓝屏问题
- Films have seen
- Spring源码阅读笔记(一):整体架构与核心技术
- vivo联合天猫超品日共同打造X70系列城市影像馆