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]