Как мне искать снизу вверх, используя регулярное выражение? - PullRequest
0 голосов
/ 13 июля 2010

Вот пример типа текстового файла, который я пытаюсь найти (с именем usefile):

ДОК звукоподражания ДОК бла бла
бла ДОК бла
DOCK
бла-бла-бла
звукоподражания
бла-бла-бла
бла-бла-док
ДОК бла-бла
ДОК бла
звукоподражания

Я использую оператор finditer, чтобы найти все между DOCK и звукоподражанием следующим образом:

re.finditer(r'((dock)(.+?)(onomatopoeia))', usefile, re.I|re.DOTALL)

Очевидно, Dock - это гораздо более распространенное слово, чем звукоподражание, и я хочу перехватить текст только между первым экземпляром Dock и до звукоподражания. Регулярное выражение, которое я использую выше, захватывает текст между первым экземпляром Dock и останавливается, когда он достигает ономатопоэю, поэтому я могу получить звукоподражание Dock Dock Dock Dock Dock, когда мне действительно нужна только ономатопея Dock.

Чтобы было ясно, что я хочу сверху, это:
1. ДОК ономатопея
2. ДОК-бла-бла-бла-ономатопея
3. ДОК-бла-ономатопея

Есть ли способ найти звукоподражание и перейти к первому случаю док-станции, или лучший способ решить мою проблему?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 13 июля 2010

Отрицательное утверждение в перспективе поможет.

DOCK((?!DOCK).)+?onomatopoeia
0 голосов
/ 13 июля 2010

Вот алгоритмический подход:

  • set pushing == false.
  • Разбейте текст на слова (например, буквы) и зациклите их.
  • после нажатия кнопки DOCK и нажатия == false, поместите его в стек и установите pushing = true
  • , если вы нажали ono ... и нажмите == true, распечатайте все, что находится в стеке плюс ono..., затем очистите стек и установите pushing = false.
  • любое другое слово, если pushing == true, нажмите его.
  • DOCK, если pushing == true, очистите стек,затем нажмите свой новый док.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...