我有一个混合了大写和小写字母的字符串。我需要找到每个由3个大写字母组成的小写字母,并从字符串中提取它。
例如ZZZaZZZ
我想提取前一个字符串中的a
。
我编写了一个脚本,只能提取ZZZaZZZ
而不是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)
修改
谢谢你们的答案!我想我应该更具体一点。我需要找到由三个完全相同的大写字母包围的小写字母,例如在我的示例ZZZaZZZ
中。
答案 0 :(得分:5)
你所以关闭!阅读MatchObjects的.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')
其内容如下:
middle
的组中。middle
组的值。答案 1 :(得分:4)
r = re.compile("(?<=[A-Z]{3})[a-z](?=[A-Z]{3})")
(?<=...)
表示积极的外观,(?=...)
是一个积极的向前看。
(?=...)
匹配if ...匹配next,但不消耗任何字符串。这称为先行断言。例如,
Isaac (?=Asimov)
只有在'Isaac '
之后才匹配'Asimov'
。
(?<=...)
匹配,如果字符串中的当前位置前面有匹配的...,那将在当前位置结束。
答案 2 :(得分:3)
您需要使用括号捕获您感兴趣的字符串部分,然后使用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."