全国做网站的公司有哪些,顺德高端网站建设,wordpress 分类下文章列表,广州十大传媒公司1. 正则表达式基础
1.1. 简单介绍
正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具#xff0c;拥有自己独特的语法以及一个独立的处理引擎#xff0c;效率上可能不如str自带的方法#xff0c;但功能十分强大。得益于这一点#xff0c;在提供了正则…1. 正则表达式基础
1.1. 简单介绍
正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具拥有自己独特的语法以及一个独立的处理引擎效率上可能不如str自带的方法但功能十分强大。得益于这一点在提供了正则表达式的语言里正则表达式的语法都是一样的区别只在于不同的编程语言实现支持的语法数量不同但不用担心不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式只需要简单看一看就可以上手了。
下图展示了使用正则表达式进行匹配的流程
正则表达式的大致匹配过程是依次拿出表达式和文本中的字符比较如果每一个字符都能匹配则匹配成功一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界这个过程会稍微有一些不同但也是很好理解的看下图中的示例以及自己多使用几次就能明白。
下图列出了Python支持的正则表达式元字符和语法
1.2. 数量词的贪婪模式与非贪婪模式
正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的在少数语言里也可能是默认非贪婪总是尝试匹配尽可能多的字符非贪婪的则相反总是尝试匹配尽可能少的字符。例如正则表达式ab*“如果用于查找abbbc”将找到abbb。而如果使用非贪婪的数量词ab*?“将找到a”。
1.3. 反斜杠的困扰
与大多数编程语言相同正则表达式里使用“作为转义字符这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”“那么使用编程语言表示的正则表达式里将需要4个反斜杠”\\\“前两个和后两个分别用于在编程语言里转义成反斜杠转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题这个例子中的正则表达式可以使用r”\“表示。同样匹配一个数字的”\\d可以写成r\d。有了原生字符串你再也不用担心是不是漏写了反斜杠写出来的表达式也更直观。
1.4. 匹配模式
正则表达式提供了一些可用的匹配模式比如忽略大小写、多行匹配等这部分内容将在Pattern类的工厂方法re.compile(pattern[, flags])中一起介绍。
2. re模块
2.1. 开始使用re
Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例然后使用Pattern实例处理文本并获得匹配结果一个Match实例最后使用Match实例获得信息进行其他的操作。
# encoding: UTF-8
import re# 将正则表达式编译成Pattern对象
pattern re.compile(rhello)# 使用Pattern匹配文本获得匹配结果无法匹配时将返回None
match pattern.match(hello world!)if match:# 使用Match获得分组信息print match.group()### 输出 ###
# hellore.compile(strPattern[, flag]):
这个方法是Pattern类的工厂方法用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式取值可以使用按位或运算符’|‘表示同时生效比如re.I | re.M。另外你也可以在regex字符串中指定模式比如re.compile(‘pattern’, re.I | re.M)与re.compile(’(?im)pattern’)是等价的。 可选值有
* re. **I** (re.IGNORECASE): 忽略大小写括号内是完整写法下同
* **M** (MULTILINE): 多行模式改变^和$的行为参见上图
* **S** (DOTALL): 点任意匹配模式改变.的行为
* **L** (LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
* **U** (UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
* **X** (VERBOSE): 详细模式。这个模式下正则表达式可以是多行忽略空白字符并可以加入注释。以下两个正则表达式是等价的Match
Match对象是一次匹配的结果包含了很多关于此次匹配的信息可以使用Match提供的可读属性或方法来获取这些信息。
属性
string : 匹配时使用的文本。re : 匹配时使用的Pattern对象。pos : 文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。endpos : 文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。lastindex : 最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组将为None。lastgroup : 最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组将为None。
方法
1. **group([group1, …]):** 获得一个或多个分组截获的字符串指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名编号0代表整个匹配的子串不填写参数时返回group(0)没有截获字符串的组返回None截获了多次的组返回最后一次截获的子串。 2. groups([default]): 以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代默认为None。 3. **groupdict([default]): ** 返回以有别名的组的别名为键、以该组截获的子串为值的字典没有别名的组不包含在内。default含义同上。 4. start([group]): 返回指定的组截获的子串在string中的起始索引子串第一个字符的索引。group默认值为0。 5. **end([group]): ** 返回指定的组截获的子串在string中的结束索引子串最后一个字符的索引1。group默认值为0。 6. **span([group]): ** 返回(start(group), end(group))。
# match从起始位置开始匹配匹配成功返回一个对象未匹配成功返回Nonematch(pattern, string, flags0)# pattern 正则模型# string 要匹配的字符串# falgs 匹配模式X VERBOSE Ignore whitespace and comments for nicer looking REs.I IGNORECASE Perform case-insensitive matching.M MULTILINE ^ matches the beginning of lines (after a newline)as well as the string.$ matches the end of lines (before a newline) as wellas the end of the string.S DOTALL . matches any character at all, including the newline.A ASCII For string patterns, make \w, \W, \b, \B, \d, \Dmatch the corresponding ASCII character categories(rather than the whole Unicode categories, which is thedefault).For bytes patterns, this flag is the only availablebehaviour and neednt be specified.L LOCALE Make \w, \W, \b, \B, dependent on the current locale.U UNICODE For compatibility only. Ignored for string patterns (itis the default), and forbidden for bytes patterns.# 无分组r re.match(h\w, origin)print(r.group()) # 获取匹配到的所有结果print(r.groups()) # 获取模型中匹配到的分组结果print(r.groupdict()) # 获取模型中匹配到的分组结果# 有分组# 为何要有分组提取匹配成功的指定内容先匹配成功全部正则再匹配成功的局部内容提取出来r re.match(h(\w).*(?Pname\d)$, origin)print(r.group()) # 获取匹配到的所有结果print(r.groups()) # 获取模型中匹配到的分组结果print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组demo
**search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]): ** 这个方法用于查找字符串中可以匹配成功的子串。从string的pos下标处起尝试匹配pattern如果pattern结束时仍可匹配则返回一个Match对象若无法匹配则将pos加1后重新尝试匹配直到posendpos时仍无法匹配则返回None。 pos和endpos的默认值分别为0和len(string))re.search()无法指定这两个参数参数flags用于编译pattern时指定匹配模式。
# search,浏览整个字符串去匹配第一个未匹配成功返回None
# search(pattern, string, flags0)# 无分组r re.search(a\w, origin)print(r.group()) # 获取匹配到的所有结果print(r.groups()) # 获取模型中匹配到的分组结果print(r.groupdict()) # 获取模型中匹配到的分组结果# 有分组r re.search(a(\w).*(?Pname\d)$, origin)print(r.group()) # 获取匹配到的所有结果print(r.groups()) # 获取模型中匹配到的分组结果print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组demo
**split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]): ** 按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数不指定将全部分割。
# split根据正则匹配分割字符串split(pattern, string, maxsplit0, flags0)
# pattern 正则模型
# string 要匹配的字符串
# maxsplit指定分割个数
# flags 匹配模式# 无分组origin hello alex bcd alex lge alex acd 19r re.split(alex, origin, 1)print(r)# 有分组origin hello alex bcd alex lge alex acd 19r1 re.split((alex), origin, 1)print(r1)r2 re.split((al(ex)), origin, 1)print(r2)demo
**findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]): ** 搜索string以列表形式返回全部能匹配的子串。
# findall获取非重复的匹配列表如果有一个组则以列表形式返回且每一个匹配均是字符串如果模型中有多个组则以列表形式返回且每一个匹配均是元祖
# 空的匹配也会包含在结果中
#findall(pattern, string, flags0)# 无分组r re.findall(a\w,origin)print(r)# 有分组origin hello alex bcd abcd lge acd 19r re.findall(a((\w*)c)(d), origin)print(r)demo
**sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]): ** 使用repl替换string中每一个匹配的子串后返回替换后的字符串。 当repl是一个字符串时可以使用\id或\g、\g引用分组但不能使用编号0。 当repl是一个方法时这个方法应当只接受一个参数Match对象并返回一个字符串用于替换返回的字符串中不能再引用分组。 count用于指定最多替换次数不指定时全部替换。
# sub替换匹配成功的指定位置字符串sub(pattern, repl, string, count0, flags0)
# pattern 正则模型
# repl 要替换的字符串或可执行对象
# string 要匹配的字符串
# count 指定匹配个数
# flags 匹配模式 # 与分组无关origin hello alex bcd alex lge alex acd 19r re.sub(a\w, 999, origin, 2)print(r)demo
**subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]): ** 返回 (sub(repl, string[, count]), 替换次数)。
import rep re.compile(r(\w) (\w))
s i say, hello world!print p.subn(r\2 \1, s)def func(m):return m.group(1).title() m.group(2).title()print p.subn(func, s)### output ###
# (say i, world hello!, 2)
# (I Say, Hello World!, 2)