Python 查找一个由三个大写字母环绕的小写字母

Python 查找一个由三个大写字母环绕的小写字母,python,regex,string,Python,Regex,String,我有一个混合了大小写字母的字符串。我需要找到每个由3个大写字母组成的小写字母,并从字符串中提取它 例如,zzzazz我想提取前一个字符串中的a 我写了一个脚本,可以提取zzzazz,但不能单独提取a。我知道我需要使用嵌套的正则表达式来实现这一点,但我不能集中精力去实现它。以下是我所拥有的: import string, re

我有一个混合了大小写字母的字符串。我需要找到每个由3个大写字母组成的小写字母,并从字符串中提取它

例如,
zzzazz
我想提取前一个字符串中的
a

我写了一个脚本,可以提取
zzzazz
,但不能单独提取
a
。我知道我需要使用嵌套的正则表达式来实现这一点,但我不能集中精力去实现它。以下是我所拥有的:

import string, re                                                                                                                                                                

if __name__ == "__main__":                                                                                                                                                       

    #open the file                                                                                                                                                               
    eqfile = open("string.txt")                                                                                                                                                
    gibberish = eqfile.read()                                                                                                                                                    
    eqfile.close()                                                                                                                                                               

    r = re.compile("[A-Z]{3}[a-z][A-Z]{3}")                                                                                                                                      
    print r.findall(gibberish)           
编辑: 谢谢你们的回答,伙计们!我想我应该说得更具体些。我需要找到由三个完全相同的大写字母包围的小写字母,例如在我的示例中,
zzazz
r=re.compile((?
r=re.compile((?你太接近了!请阅读的
.group
*方法。例如,如果你的脚本以

r = re.compile("(?<=[A-Z]{3})[a-z](?=[A-Z]{3})") 
r = re.compile("[A-Z]{3}([a-z])[A-Z]{3}")
print r.match(gibberish).group(1)
然后在第一组中捕获所需的角色

要解决匹配重复字母的新约束,可以使用反向引用:

r = re.compile(r'([A-Z])\1{2}(?P<middle>[a-z])\1{3}')
m = r.match(gibberish)
if m is not None:
    print m.group('middle')
r=re.compile(r'([A-Z])\1{2}(?P[A-Z])\1{3})
m=r.匹配(胡言乱语)
如果m不是无:
打印m.group('中间')
这看起来像:

  • 匹配字母a-Z并记住它
  • 匹配找到的第一个字母的两个匹配项
  • 匹配小写字母并将其存储在名为
    middle
    的组中
  • 再匹配找到的第一个字母的三个连续实例
  • 如果找到匹配项,则打印
    middle
    组的值
  • 太接近了!请阅读的
    .group
    *方法。例如,如果您的脚本以

    r = re.compile("[A-Z]{3}([a-z])[A-Z]{3}")
    print r.match(gibberish).group(1)
    
    然后在第一组中捕获所需的角色

    要解决匹配重复字母的新约束,可以使用反向引用:

    r = re.compile(r'([A-Z])\1{2}(?P<middle>[a-z])\1{3}')
    m = r.match(gibberish)
    if m is not None:
        print m.group('middle')
    
    r=re.compile(r'([A-Z])\1{2}(?P[A-Z])\1{3})
    m=r.匹配(胡言乱语)
    如果m不是无:
    打印m.group('中间')
    
    这看起来像:

  • 匹配字母a-Z并记住它
  • 匹配找到的第一个字母的两个匹配项
  • 匹配小写字母并将其存储在名为
    middle
    的组中
  • 再匹配找到的第一个字母的三个连续实例
  • 如果找到匹配项,则打印
    middle
    组的值

  • 您需要用括号捕获您感兴趣的字符串部分,然后用
    re.MatchObject#group
    访问它:

    r = re.compile("[A-Z]{3}([a-z])[A-Z]{3}")                                                                                                                                      
    m = r.match(gibberish)
    if m:
       print "Match! Middle letter was " + m.group(1)           
    else:
       print "No match."
    

    您需要用括号捕获您感兴趣的字符串部分,然后用
    re.MatchObject#group
    访问它:

    r = re.compile("[A-Z]{3}([a-z])[A-Z]{3}")                                                                                                                                      
    m = r.match(gibberish)
    if m:
       print "Match! Middle letter was " + m.group(1)           
    else:
       print "No match."
    

    这将无法匹配
    “aaabaabaaa”
    中的两个小写字母。这将无法匹配
    “aaabaabaaa”
    中的两个小写字母。这将无法匹配
    “aaabaabaaa”
    中的两个小写字母。这将无法匹配
    中的两个小写字母
    +1,但我认为您不需要同时使用“向前看”和“向后看”。任何一个单独使用都应该可以,另一个是正常的match@gnibbler,是的,但这样做的话,如果你做一个
    findall
    finditer
    ,你只需要返回一个列表,而不需要理解(?@MikeSamuel到目前为止,您的解决方案运行得最好,但我想我应该更具体一些。大写字母必须完全相同,如我在上面使用的示例
    ZZZaZZZ
    +1,但我认为您不需要同时使用“向前看”和“向后看”。任何一个单独使用都应该与另一个正常使用match@gnibbl呃,是的,但这样做的话,如果你做一个
    findall
    finditer
    你只需要返回一个列表,而不需要做理解(?@MikeSamuel到目前为止,您的解决方案是最有效的,但我想我应该更具体一些。大写字母必须完全相同,如我上面使用的示例
    zzzazz