2.7 - 正则表达式

2.7.1 正则表达式 - 普通字符及正则方法

import re

# 正则表达式 - 普通字符
string = 'hello world rld'
p = re.compile('rld')  # 编译正则表达式,返回Pattern实例对象
m = p.search(string) # 寻找字符串中 第一个 符合规则的子串 print(isinstance(m, re.Match), m) n = p.match(string, 6, 9) # 从pos指定的下标位置开始匹配(参数默认0),如果指定下标位置匹配不上就返回None print(n) k = p.fullmatch(string, 3, 5) # 整个字符串完全匹配 print(k) # 对于普通字符而言,只能是 表达式和字符串相同才可以,一般用来匹配元字符规则 x = p.findall(string, 2, 1) # 获取所有匹配成功的,返回一个列表 print(x)

2.7.2 正则表达式 - 特殊字符(元字符)

  正则表达式,不论是普通字符还是元字符,不要随便加空格,因为在匹配的时候,空格也会被看作匹配规则的一部分!!!

"""
.       除换行符(\n)之外的任意一个字符
.       编译模式(re.compile(pattern, flags=re.S))下的 . ,可以匹配包含换行符(\n)在内的任意一个字符

^       字符串开头,多行模式下(re.compile(pattern,flags=re.M)),换行符也当作开头
$       字符串结尾,多行模式下,换行符也当作结尾

*       对前面的正则表达式 [0,+∞) 次贪婪重复匹配
+       对前面的正则表达式 [1,+∞) 次贪婪重复匹配
?       对前面的正则表达式 [0, 1] 次贪婪重复匹配
{m}     对前面的正则表达式 m 次重复匹配
{m,n}   对前面的正则表达式 [m, n] 次贪婪重复匹配
    ---上述5个都是贪婪的,能匹配多少就匹配多少
    ---上述5个后面加上?,贪婪 =》非贪婪
    
|      或,分支结构,'cat|dog':匹配的是 cat和dog,不是 catog和cadog。
\       转义字符

\b      匹配字符串的边界. 所谓边界:isalnum为True的都不是边界
\B      匹配字符串的非边界,

\d      匹配数字字符
\D      匹配非数字字符

\s      匹配任意一个空白符(空格,换行\n,制表符\t)
\S      匹配任意一个非空白符

\w      匹配任意一个 (数字 字母 下划线) 等价于 [a-zA-Z0-9]
\W      匹配任意一个非 (数字 字母 下划线)

\Z      只匹配末尾且不接收换行模式;$匹配末尾或末尾的\n,且识别 换行模式re.M
"""

2.7.3 元字符 之 字符组

  [...]        字符组,可匹配其中任意一个字符。在字符组中,只有 - 和 ^ 和 转义字符 才可能是元字符,其它的如 + ? . 等都是普通字符。

  [  -  ]      连字符,表示一个范围,如:[a-zA-Z0-9],表示任意一个 大小写字母或数字

  [^...]       排除字符,如:[^a-zA-Z] ,表示:匹配 非大小写字母 的字符

     字符集内,除了元字符,其余普通字符表达的含义都是 ,而字符集外的普通字符,表达的含义是:当前是接下来是。

2.7.4 环视

  匹配前缀,匹配后缀和寻找重复的单词

 

2.7.5 分组和捕获

  1) 分组的初始化

    a. 直接用圆括号 (exp)  ,第一个分组编号为1,第二个分组编号为2,... 。整个正则表达式的分组编号是0。

    b. 定义分组并命名 (?P<name>exp) ,分组的同时也会分配分组编号。

    c. 非捕获分组 (?: exp)  ,只负责匹配文本,既没有分组名,也没有分组编号,也不能被引用。

  2)引用分组

    引用分组是对前面匹配到的文本进行重复匹配,不是匹配规则!!!

    可以通过分组名称:(?P=name) 或 分组编号:\编号 来引用分组。注:非捕获分组既没有名称,也没有编号,因此,不能被引用

2.7.6 正则表达式的方法

  1)findall

    对于非捕获分组,findall方法,会返回所有匹配到的文本的列表。

>>> re.findall(r'(\d{3,4}-)?(\d{7,8})','020-82228888\n0357-4227865') 
[('020-', '82228888'), ('0357-', '4227865')]

    对于捕获分组,findall()方法,会返回一个元组列表,每个元组的组成元素是,每个子分组匹配到的内容。

>>> re.findall(r'(?:\d{3,4}-)?\d{7,8}','020-82228888\n4227865')     
['020-82228888', '4227865']

  2)sub  将正则匹配到的文本进行替换

p = re.compile(r'blue|red|yellow|green')
x = p.sub('color', "the flower's color including red, blue, green.")
print(x)

# 结果:the flower's color including color, color, color.

 

 

Reference

  https://www.cnblogs.com/ljhdo/p/4847209.html

 

posted @ 2024-02-01 23:15  橘子葡萄火龙果  阅读(19)  评论(0)    收藏  举报