Python(re_group_learning)

本文深入探讨了正则表达式中的分组概念,包括分组编号、matchobject的相关方法如group()、groups()和groupdict()。此外,还介绍了正向和负向断言、后视断定以及分组命名和引用。通过实例解析了各种用法,并展示了如何在实际匹配中应用这些技术。
摘要由CSDN通过智能技术生成
"""
正则表达式中的分组:
分组的标识形式:()
分组会默认分配组号(组id): 按照从左到右的顺序去数左括号
                       第一个左括号的id就为1
match object的和组相关的方法
group(int/str): int: 组id 可以是0, 1, 2...
                str: 组名
    group() == group(0) => 0 代表就是匹配成功的完整结果
    group(1) => 只输出组1的匹配结果
    group(2) => 只输出组2的匹配结果
    groups() => 以元组的形式输出所有组的结果
    groupdict() => 我们在给组命名过后,输出所有组的 组名: 匹配结果
\number => 就是引用分组的组号(id) \1 \2
(?…): 这是使用分组的一种语法 后边分组的形式(?xxx)
(?:): 在正则表达式中,前边的分组不能被引用
(?aiLmsux:): 和我们前边使用的re中的flags等效:
            re.A, re.I, re.U, re.S, re.X, re.M
(?aiLmsux-imsx:...) : -后跟随的是可选的选项
(?P<name>…): 给分组命名
(?P=name): 反向引用一个命名组合
(?#…): 注释
(?=..): lookahead assertion 正向断言
        不消费样式的内容:字符串1(?=字符串2)
        在去匹配的时候如果字符串1后边跟的是字符串2,那么匹配成功返回的是字符串1
        字符串2不返回,只作为匹配成功的条件
(?!...) negative lookahead assertion 正向断言取反
        不消费样式的内容:字符串1(?!字符串2)
        在去匹配的时候如果字符串1后边跟的不是字符串2,那么匹配成功返回的是字符串1
        字符串2不返回,只作为匹配成功的条件
(?<=...) positive lookbehind assertion 正向后视断定
         不消费样式的内容: (?<=字符串2)字符串1
         在去匹配的时候如果字符串1前边跟的是字符串2,那么匹配成功返回的是字符串1
         字符串2不返回,只作为匹配成功的条件
(?<!...) 不消费样式的内容: (?<!字符串2)字符串1
         在去匹配的时候如果字符串1前边跟的不是字符串2,那么匹配成功返回的是字符串1
         字符串2不返回,只作为匹配成功的条件

(?(id/name)yes-pattern|no-pattern):
如果给定的 id 或 name 存在,将会尝试匹配 yes-pattern ,
    否则就尝试匹配 no-pattern , no-pattern可选
    如果< 存在那么我们是要匹配>
    如果< 不存在那么我们不匹配>
id: 组id
name: 组名
"""
import re
str_data = "abcd"
pattern = "a(b(c))d" # 两对括号,就由两个分组

match_obj = re.search(pattern, str_data)
print(match_obj)
print(match_obj.group())
print(match_obj.group(0))
print(match_obj.group(1))
print(match_obj.group(2))
print(match_obj.groups())
print(match_obj.groupdict())

# \number => 就是引用分组的组号(id)
str_data = "abcdbcc"
pattern = r"a(b(c))d\1\2"
print(re.search(pattern, str_data))

# (?:)
str_data = "abcdbcc"
pattern = r"a(?:b(c))d\1\2"
# print(re.search(pattern, str_data))

str_data = "abcd"
pattern = "a(?i:BC)d"
print(re.search(pattern, str_data))

str_data = "abcd"
pattern = r"a(?P<g1>b(?P<g2>c))d"
match_obj = re.search(pattern, str_data)
print(match_obj)
print(match_obj.group("g1"))
print(match_obj.group("g2"))
print(match_obj.groupdict())

str_data = "abcdbcc"
pattern = r"a(?P<g1>b(?P<g2>c))d(?P=g1)(?P=g2)"
match_obj = re.search(pattern, str_data)
print(match_obj)

str_data = "abcdbcc"
pattern = r"a(?P<g1>b(?P<g2>c))d(?P=g1)(?P=g2)(?#使用组名引用分组)"
match_obj = re.search(pattern, str_data)
print(match_obj)


str_data2 = "windows10"
str_data = "windows98"
pattern = "windows(?=10)"
print(re.match(pattern, str_data))
print(re.match(pattern, str_data2))


str_data2 = "windows10"
str_data = "windows98"
pattern = "windows(?!10)"
print(re.match(pattern, str_data))
print(re.match(pattern, str_data2))

str_data2 = "windows10"
str_data = "windows98"
pattern = "(?<=windows)10"
print(re.search(pattern, str_data))
print(re.search(pattern, str_data2))

str_data2 = "windows10"
str_data = "Linux10"
pattern = "(?<!windows)10"
print(re.search(pattern, str_data))
print(re.search(pattern, str_data2))

#如果 < 存在那么我们是要匹配 >
#如果 < 不存在那么我们不匹配 >
#(?(id/name)yes-pattern|no-pattern)
pattern = "(<)?\w+@\w+.com(?(1)>|)"
str_data = "<user@host.com>"
str_data2 = "user@host.com"
print(re.search(pattern, str_data))
print(re.search(pattern, str_data2))

pattern = "(?P<g1><)?\w+@\w+.com(?(g1)>|)"
str_data = "<user@host.com>"
str_data2 = "user@host.com"
print(re.search(pattern, str_data))
print(re.search(pattern, str_data2))


"""
1.所有分组的应用:
():



"""



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值