У меня есть строка с комбинацией прописных и строчных букв. Мне нужно найти каждую строчную букву, которая обрабатывается тремя заглавными буквами и извлекает ее из строки.
Например 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)
EDIT: Спасибо за ответы, ребята! Наверное, я должен был быть более конкретным. Мне нужно найти строчную букву, которая окружена тремя прописными буквами, которые точно такие же, как в моем примере ZZZaZZZ
.
Вы так близко! Читайте о .group
* методов MatchObjects. Например, если ваш скрипт закончился
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
группы.r = re.compile("(?<=[A-Z]{3})[a-z](?=[A-Z]{3})")
(?<=...)
указывает на положительный lookbehind и (?=...)
является положительным взглядом.
(?=...)
Соответствует, если... соответствует следующей, но не использует ни одну из строк. Это называется ожидаемым утверждением. Например,
Isaac (?=Asimov)
будет соответствовать'Isaac '
только если его последует'Asimov'
.
(?<=...)
Соответствует, если текущей позиции в строке предшествует совпадение для..., которое заканчивается в текущей позиции.
findall
или finditer
вы просто возвращаете список без необходимости понимания.
Вам нужно захватить часть интересующей вас строки в круглых скобках, а затем получить доступ к ней с 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."
"AAAbAAAbAAA"
.
"AAAbAAAbAAA"
.