【2021-10-18】python 正则 (?P......) 学习

本文通过实例展示了Python正则表达式的使用,包括match()方法、groupdict()、lastindex、groups等属性,以及如何进行字符串替换。重点讨论了匹配对象的方法和属性,以及在处理匹配结果时的技巧。同时,文中还提供了链接供进一步学习正则表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import re
import json
import pprint
from pprint import pprint
# https://docs.python.org/zh-cn/3/library/re.html#search-vs-match

from prettytable import PrettyTable



def displaymatch(match):
    if match is None:
        raise Exception("手动抛出一个炸弹💣") 
    PT = PrettyTable(["方法/属性", "输出"])
    PT.add_row(["string", match.string])            # 返回要匹配的字符串
    PT.add_row(["匹配对象", match])                  # 返回一个匹配对象
    PT.add_row(["__getitem__", match[0]])           # 返回下标内的数据
    PT.add_row(["groupdict", match.groupdict()])    # 返回一个字典,包含了所有的 命名 子组。key就是组名。
    PT.add_row(["lastindex", match.lastindex])      # 捕获组的最后一个匹配的整数索引值
    PT.add_row(["groups", match.groups()])          # 返回一个元组,包含所有匹配的子组,在样式中出现的从1到任意多的组合
    PT.add_row(["lastgroup", match.lastgroup])      # 最后一个匹配的命名组名字,或者 None 如果没有产生匹配的话。
    PT.add_row(["group", match.group()])            # 返回一个或者多个匹配的子组
    PT.add_row(["span", match.span()])              # 返回匹配结果的位置,左闭右开区间
    PT.add_row(["start", match.start()])            # 返回区间的标号
    PT.add_row(["end", match.end()])                # 返回区间的标号
    PT.add_row(["pos", match.pos])                  # 这个是正则引擎开始在字符串搜索一个匹配的索引位置。
    PT.add_row(["endpos", match.endpos])            # 这个是正则引擎停止在字符串搜索一个匹配的索引位置
    if len(match.groupdict())==1:
        # 对 模板`template` 进行反斜杠转义替换并且返回,就像 sub() 方法中一样 【复用】
        PT.add_row(["expand", match.expand(r'我是大笨猪: \g<1>')])
    elif len(match.groupdict())==2:
        # 对 模板`template` 进行反斜杠转义替换并且返回,就像 sub() 方法中一样 【复用】
        PT.add_row(["expand", match.expand(r'His name is \g<1> \g<2>')])
    print("\r\n☀️ᴾᴵᴺᴷ ᴹᴱ☁️☁️☁️☁️☁️ ")
    print(PT)



# match()   # 默认匹配包含最右+1
valid = re.compile(r"^[a2-9tjqk]{5}$")
# displaymatch(valid.match("akt5q"))
# displaymatch(valid.match("akt5e"))        # Exception: 手动抛出一个炸弹💣
# displaymatch(valid.match("akt"))          # Exception: 手动抛出一个炸弹💣
# displaymatch(valid.match("727ak"))


# pair = re.compile(r".*(.).*\1") 
# displaymatch(pair.match("717ak"))
# displaymatch(pair.match("718ak"))           # Exception: 手动抛出一个炸弹💣
# displaymatch(pair.match("354aa1a"))



# expand(r'His name is \g<first_name> \g<last_name>')
# (?P<name>[\w]+) --> 用于标记
# \w --> (单词、字符,如大小写字母,数字,_ 下划线)
# valid = re.compile(r'(?P<first_name>\w+) (?P<last_name>\w+)') # 命名组合: 跟匹配的数据进行组合
# displaymatch(valid.match("Malcolm Reynolds"))



# 正则学习:https://www.bookstack.cn/read/python-3.10.0-zh/868c2e547f2c81e9.md#search()%20vs.%20match()
# (?i)忽略大小写 【这里空格是需要的】
# (?P<name>[\w]+) --> 用于标记
# (?P=name)       --> 在同一个正则表达式中复用
pair = re.compile(r'(?i)(?P<name>[\w]+) (?P=name)')
displaymatch(pair.match("AAbb aabb")) # <re.Match object; span=(0, 9), match='AAbb aabb'>



# 学习:https://blog.youkuaiyun.com/qq_35696312/article/details/95051232
# 正则学习:https://www.bookstack.cn/read/python-3.10.0-zh/868c2e547f2c81e9.md#search()%20vs.%20match()
# (?i)忽略大小写 
# (?P<name>[\w]+) --> 用于标记
# (?P=name)       --> 用于复用【sub() 会使用命名组合 name】
astr = 'aabb aacc aadd ddee'
result = re.sub(r'(?i)aa(?P<pattern>[\w]+)',r'KK\g<pattern>',astr)
print('{} <==> {}'.format(astr,result))
# aabb aacc aadd ddee <==> KKbb KKcc KKdd ddee
"""
解析: r'(?i)aa(?P<pattern>[\w]+)'
(?i)        -->     忽略大小写
(?P<name>)  -->     用于标记
[\w]+       -->     一个或多个(单词、字符,如大小写字母,数字,_ 下划线)


解析: r'KK\g<pattern>'
\g<pattern> -->     复用之前的全部标记,用字符`KK`替换标记字符前面的字符串
"""
☀️ᴾᴵᴺᴷ ᴹᴱ☁️☁️☁️☁️☁️ 
+-------------+---------------------------------------------------+
|  方法/属性  |                        输出                       |
+-------------+---------------------------------------------------+
|    string   |                     AAbb aabb                     |
|   匹配对象  | <re.Match object; span=(0, 9), match='AAbb aabb'> |
| __getitem__ |                     AAbb aabb                     |
|  groupdict  |                  {'name': 'AAbb'}                 |
|  lastindex  |                         1                         |
|    groups   |                     ('AAbb',)                     |
|  lastgroup  |                        name                       |
|    group    |                     AAbb aabb                     |
|     span    |                       (0, 9)                      |
|    start    |                         0                         |
|     end     |                         9                         |
|     pos     |                         0                         |
|    endpos   |                         9                         |
|    expand   |                  我是大笨猪: AAbb                 |
+-------------+---------------------------------------------------+
aabb aacc aadd ddee <==> KKbb KKcc KKdd ddee
[Finished in 329ms]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迷心兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值