代码之家  ›  专栏  ›  技术社区  ›  nalzok granmirupa

使用正则表达式匹配行中的相同字符

  •  2
  • nalzok granmirupa  · 技术社区  · 8 年前

    我想使用正则表达式匹配“三个大写字母、一个小写字母和三个大写字符”。让这件事变得困难的是 相邻大写字母必须相同 例如,我希望 AAAbCCC 是,但不是 AAAbCCD ABAbCDC .

    以下是我尝试过的:

    print(re.findall("[A-Z]{3}[a-z][A-Z]{3}", l))
    

    然而,这不是我想要的,因为它匹配 AAAbCCD

    3 回复  |  直到 8 年前
        1
  •  3
  •   heemayl    8 年前

    利用捕获的分组:

    ^([A-Z])\1\1[a-z]([A-Z])\2\2$
    

    Demo

    • ^([A-Z]) 捕获第一个大写字母并放入捕获的组1, \1\1 匹配下两个字符,如果它们与捕获的字符相同。第二个捕获的也一样,稍后由 \2

    您可以使用范围匹配, {} :

    ^([A-Z])\1{2}[a-z]([A-Z])\2{2}$
    
        2
  •  3
  •   Tryph    8 年前

    你可以使用 ([A-Z])\1{2}[a-z]([A-Z])\2{2} .

    它将第一个找到的超大小写字符存储在组中,并与 \1 (及 \2 )检查以下两个字符。

        3
  •  2
  •   Eugene Yarmash    8 年前

    re.findall(r"(([A-Z])\2\2[a-z]([A-Z])\3\3)", string)
    

    然而,请注意,在模式中存在组时 re.findall() 将返回组而不是匹配项。 因此,要获得匹配的字符串,需要将整个模式括在括号中,并取第一组:

    >>> s = "AAAbCCC AAAbCCD"
    >>> [groups[0] for groups in re.findall(r"(([A-Z])\2\2[a-z]([A-Z])\3\3)", s)]
    ['AAAbCCC']
    

    您还可以使用 re.finditer() ,它在 匹配对象 :

    >>> [match.group(1) for match in re.finditer(r"(([A-Z])\2\2[a-z]([A-Z])\3\3)", s)]
    ['AAAbCCC']