Python 3.x имеет функцию input()
, которая всегда возвращает строку. Поэтому вы должны преобразовать в int
python 3.x
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
python 2.x
В функциях python 2.x raw_input()
и input()
всегда возвращает строку, поэтому вы должны также преобразовать их в int.
x = int(raw_input("Enter a number: "))
y = int(input("Enter a number: "))
Это регулярное выражение должно соответствовать тому, что вы хотите:
(start((?!start).)*?end)
Используйте метод re.findall
и однострочный модификатор re.S
, чтобы получить все вхождения в многострочной строке:
re.findall('(start((?!start).)*?end)', text, re.S)
Смотрите здесь .
Это сложно сделать, потому что по умолчанию модуль re
не смотрит на совпадающие совпадения. Новые версии Python имеют новый модуль regex
, который позволяет совпадающие совпадения.
https://pypi.python.org/pypi/regex
Вы хотели бы использовать что-то вроде
regex.findall(pattern, string, overlapped=True)
. Если вы застряли с Python 2.x или чем-то еще, у которого нет regex
, это все еще возможно с некоторыми обманами. Один блестящий человек решил это здесь:
Regex Python находит все совпадающие совпадения?
Как только у вас есть все возможные совпадающие (не жадные, я думаю) совпадения , просто определите, какой из них самый короткий, что должно быть легко.
Вы можете сделать (?s)start.*?(?=end|start)(?:end)?
, а затем отфильтровать все, не заканчивающееся «end».
Сделайте это с помощью кода - основного автомата:
open = False
tmp = []
for ln in fi:
if 'start' in ln:
if open:
tmp = []
else:
open = True
if open:
tmp.append(ln)
if 'end' in ln:
open = False
for x in tmp:
print x
tmp = []