Извлеките подстроку между ближайшими строками с помощью regexp [duplicate]

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: "))
3
задан Eero Aaltonen 9 July 2014 в 13:17
поделиться

4 ответа

Это регулярное выражение должно соответствовать тому, что вы хотите:

(start((?!start).)*?end)

Используйте метод re.findall и однострочный модификатор re.S, чтобы получить все вхождения в многострочной строке:

re.findall('(start((?!start).)*?end)', text, re.S)

Смотрите здесь .

9
ответ дан famousgarkin 22 August 2018 в 07:45
поделиться
  • 1
    Почему я никогда не слышал о regex101 раньше ...? – RevanProdigalKnight 8 July 2014 в 21:24
  • 2
    Хороший ответ и демо на regex101. Ключом, который я отсутствовал, был негативный взгляд. Действительно полезно. – Eero Aaltonen 9 July 2014 в 10:25
  • 3
    Работа в JS также. – semanser 11 August 2017 в 09:33

Это сложно сделать, потому что по умолчанию модуль re не смотрит на совпадающие совпадения. Новые версии Python имеют новый модуль regex, который позволяет совпадающие совпадения.

https://pypi.python.org/pypi/regex

Вы хотели бы использовать что-то вроде

regex.findall(pattern, string, overlapped=True)

. Если вы застряли с Python 2.x или чем-то еще, у которого нет regex, это все еще возможно с некоторыми обманами. Один блестящий человек решил это здесь:

Regex Python находит все совпадающие совпадения?

Как только у вас есть все возможные совпадающие (не жадные, я думаю) совпадения , просто определите, какой из них самый короткий, что должно быть легко.

0
ответ дан Community 22 August 2018 в 07:45
поделиться
  • 1
    Я добавил некоторую информацию о фактическом размере файла журнала. В этом случае сохранение совпадений совпадений будет превышать дисковое пространство моего компьютера. – Eero Aaltonen 9 July 2014 в 13:18
  • 2
    Ну, решение, с которым я связан, возвращает итератор, поэтому вам не нужно будет хранить все совпадающие совпадения, всего один или два за раз. Но, учитывая формат файла, который вы пытаетесь проанализировать, принятое решение, вероятно, лучше для ваших целей. – TheSoundDefense 9 July 2014 в 15:04

Вы можете сделать (?s)start.*?(?=end|start)(?:end)?, а затем отфильтровать все, не заканчивающееся «end».

0
ответ дан David Ehrmann 22 August 2018 в 07:45
поделиться

Сделайте это с помощью кода - основного автомата:

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 = []
1
ответ дан gkusner 22 August 2018 в 07:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: