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 = ''
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()) # 打印结果:
#
# ('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.

findall 参考链接: https://www.cnblogs.com/springionic/p/11327187.html

下面看下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()) # 打印结果:
#
  • re.split(patternstringmaxsplit=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 re
s = 'neo22alex18#mike-oldboy'
print(re.split('[\d+#-]',s)) # []就表示里面的都包括,效果就跟“|”类似,但有区别(代码中要注意[]和|具体用哪种), 这个例子只是想强调“[]就表示里面的都包括”这个知识点
# 输出结果:
# ['neo', '', 'alex', '', '', 'mike', 'oldboy'] # \d+没有当做一个整体去split,而是分成了\d和字符“+”去split, 我也还没想清楚为什么。。。
情况2:
import re
s = 'neo22alex18|mike-oldboy' #
假如要求以“|”为分隔符
print(re.split('\|',s))
# | 也是一个语法, 假如你在pattern不想让它作为语法、而是作为字符来使用, 就在它前面加一个斜杠“\” # 输出结果:
# ['neo22alex18', 'mike-oldboy'] # 如果想把斜杠“\”当做字符而不是语法来使用, 就在这个“\”后面再加3个“\”, 即总共4个“\” (不理解原因,先记住吧)
import re
s = 'neo22alex18\mike-oldboy'
print(re.split('\\\\',s))
# 输出结果:
# ['neo22alex18', 'mike-oldboy'] 
  • re.sub(patternreplstringcount=0,flags=0)  # 匹配字符并替换
import re
s = 'neo22alex18\mike-oldboy'
print(re.sub('\d+','+',s)) # 输出结果:
# neo+alex+\mike-oldboy
  • re.fullmatch(patternstring,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 sequence

prog = re.compile(pattern)
result = prog.match(string)
is equivalent to result = 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的写法:

  1. 软件定位,软件的基本功能。
  2. 运行代码的方法: 安装环境、启动命令等。
  3. 简要的使用说明。
  4. 代码目录结构说明,更详细点可以说明软件的基本原理。
  5. 常见问题说明。

关系目录规范的详情可参考:  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

Python模块:Re模块、附软件开发目录规范的更多相关文章

  1. python模块导入-软件开发目录规范-01

    模块 模块的基本概念 模块: # 一系列功能的结合体 模块的三种来源 """ 模块的三种来源 1.python解释器内置的模块(os.sys....) 2.第三方的别人写 ...

  2. python基础语法10 函数递归,模块,软件开发目录规范

    函数递归: 函数递归指的是重复 “直接调用或间接调用” 函数本身, 这是一种函数嵌套调用的表现形式. 直接调用: 指的是在函数内置,直接调用函数本身. 间接调用: 两个函数之间相互调用间接造成递归. ...

  3. python 之 软件开发目录规范 、logging模块

    6.4 软件开发目录规范 软件(例如:ATM)目录应该包含: 文件名 存放 备注 bin start.py,用于起动程序   core src.py,程序核心功能代码   conf settings. ...

  4. py 包和模块,软件开发目录规范

    目录 py 包和模块,软件开发目录规范 什么是包? 什么是模块? 软件开发目录规范 py 包和模块,软件开发目录规范 什么是包? 包指的是内部包__init__.py的文件夹 包的作用: 存放模块,包 ...

  5. Python 浅谈编程规范和软件开发目录规范的重要性

    最近参加了一个比赛,然后看到队友编程的代码,我觉得真的是觉得注释和命名规范的重要性了,因为几乎每个字符都要咨询他,用老师的话来说,这就是命名不规范的后续反应.所以此时的我意识到写一篇关于注释程序的重要 ...

  6. python浅谈编程规范和软件开发目录规范的重要性

    前言 我们这些初学者,目前要做的就是遵守代码规范,这是最基本的,而且每个团队的规范可能还不一样,以后工作了,尽可能和团队保持一致,目前初学者就按照官方的要求即可 新人进入一个企业,不会接触到核心的架构 ...

  7. Python记录13:软件开发目录规范

    软件开发目录规范 开发一个软件,一个工程项目,一般应该具备以下的几个基本的文件夹和模块,当然,这并不是一成不变的,根据项目的不同会有一定的差异,不过作为一个入门级的新手,建议暂时按照以下的规范编写: ...

  8. day21 模块与包+软件开发目录规范

    目录 一.导入模块的两种方式 二.模块搜索的路径的优先级 三.循环导入 四.区分py文件的两种用途 五.编写一个规范的模板 五.包 1 什么是包 2 为什么要有包 3 包的相关使用 3.1 在当前文件 ...

  9. 软件开发目录规范 ATM框架构建

    软件开发的目录规范 建立文件夹 为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要.软件的目录规范并无硬性标准,只要清晰可读即可 以ATM购物车项目为例: 首 ...

随机推荐

  1. C# 基础知识和VS2010的小技巧总汇(2)[转]

    1.使用关键字readonly ,表示这个字段只能在执行构造函数的过程中赋值,或者由初始化语句赋值 2..net4.0新增一个  Tuple 类,代表一个有序的N元组.可以调用Tuple.Create ...

  2. mac下 netbeans 8.02中文版设置代码自动补齐 + eclipse自动补齐

    netbeans自带的自动补齐快捷键是commad+\ 我想要的是在输入的时候,有自动提示,找了半天也没找到怎么搞. 因为我是用的mac系统 后来参考其他的设置,找到了设置的方法,把这个方法记录一下. ...

  3. Suricata是什么?

    不多说,直接上干货! 见Suricata的官网 https://suricata.readthedocs.io/en/latest/what-is-suricata.html snort.suirca ...

  4. Android开发学习——高德地图的实现

    1.首先做好下边的准备: 1.1  http://lbs.amap.com/   注册账号 1.2  下载 定位sdk 和 地图sdk 下载后是这样的 1.3  对下载的进行解压 将他们加入 中,对每 ...

  5. 机器学习-Probabilistic interpretation

    Probabilistic interpretation,概率解释  解释为何线性回归的损失函数会选择最小二乘 表示误差,表示unmodeled因素或随机噪声,真实的y和预测出来的值之间是会有误差的, ...

  6. 【数据分析 R语言实战】学习笔记 第一章 数据分析导引

    1.1数据分析概述 1.1.1数据分析的原则 (1)数据分析是为了验证假设的问题,需要提供必要的数据验证.在数据分析中,分析模型构建完成后,需要利用测试数据验证模型的正确性. (2)数据分析是为了挖掘 ...

  7. Context namespace element 'annotation-config' and its parser class [org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser]

    严重: Exception sending context initialized event to listener instance of class org.springframework.we ...

  8. OC 实现一个TODO宏

    实现一个TODO宏 转载http://blog.sunnyxx.com/2015/03/01/todo-macro/ 实现一个能产生warning的TODO宏,用于在代码里做备忘,效果: 下面一步步来 ...

  9. Winform之GDI绘制验证码

    主要功能:点击验证码可更换,输入验证码进行登陆 需要导入命名空间System.Drawing; 产生五位的随机字符串: 1 Random random = new Random(); //产生5个随机 ...

  10. 【分享】iTOP-iMX6UL开发板驱动看门狗 watchdog 以及 Linux-c 测试例程

    iTOP-iMX6UL开发板看门狗测试例程,iTOP-iMX6UL 开发板的看门狗驱动默认已经配置,可以直接使用测试例程. 版本 V1.1:1.格式修改:2.例程修改完善,其中增加喂狗代码.1 看门狗 ...