Извлечение слов между словом и разделителем python - PullRequest
1 голос
/ 06 марта 2020

Я извлек некоторые текстовые данные из документа word (.do c) и сохранил их в переменной my_text, так что

my_text[2] = '2 Running Hrs                         -  \tPort M/E RPM  \t-  \t'

здесь \ t - разделитель из самого документа. Я пытаюсь извлечь слово / символ между словом ' Running Hrs ' и ' \ t ' разделителем. Чтобы я мог получить вывод ' - '
Здесь я попытался

  1. Trial 1

import re
re.search('Running Hrs(.*)\t', my_text[2].strip()).group(1)

Выход

 '                         -  \tPort M/E RPM  '
Пробная версия 2
print(re.findall(r'\Running Hrs([^]\t*)\]', str(my_text[2])))

вывод

ERROR: error: bad escape \R

Любые предложения по этому поводу.

Ответы [ 4 ]

5 голосов
/ 06 марта 2020

Ваша первая попытка очень близка к тому, что вы хотите, так как вам просто нужно включить флаг ?, чтобы убедиться, что ваша группа захвата не жадная, например:

r'Running Hrs(.*?)\t'

Без этого ?, ваша группа захвата считается жадной и будет пытаться найти максимально возможное совпадение вплоть до последнего \t, тогда как не жадное выражение будет захватывать только до первого \t.

2 голосов
/ 06 марта 2020

вы можете использовать что-то вроде этого в вашем коде

start_phrase = 'Running Hrs'

start = my_text[2].index(start_phrase)+len(start_phrase)
end = my_text[2].index('\t')

my_text[2][start:end].strip()
0 голосов
/ 06 марта 2020

Если вы хотите получить - в качестве результата, я бы предложил вместо этого использовать полосу с результатом group(1).

Если \ t - это разделитель самого документа, и нет никаких других вхождений \t кроме того, что в конце, использование полосы на всей строке удалит это, и шаблон не будет совпадать.

Вместо использования не жадного .*? вы могли бы используйте взамен отрицательный класс символов [^, соответствующий любому символу, кроме табуляции или новой строки.

Running Hrs([^\t\r\n]+)\t

Regex demo | Python демо

import re

my_text = '2 Running Hrs                         -  \tPort M/E RPM  \t-  \t'
print(re.search('Running Hrs([^\t\r\n]+)\t', my_text).group(1).strip())

Выход

-

0 голосов
/ 06 марта 2020

Ваше регулярное выражение почти правильное, но соответствует как можно большему числу символов (жадное поведение). Чтобы иметь минимально совпадающие символы, вы можете установить поведение как «жадное» с помощью «?» выражение.

Также выполните .strip () после того, как вы извлекли текст между стартовым шаблоном и / / t, чтобы удалить оставшиеся пробелы.

my_text[2] = '2 Running Hrs                         -  \tPort M/E RPM  \t-  \t'

import re
re.search('Running Hrs(.*?)\t', my_text[2]).group(1).strip()

см: https://docs.python.org/3/library/re.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...