Разделить или разделить строку после определенных слов - PullRequest
0 голосов
/ 19 ноября 2018

Позвольте мне начать с того, что я достаточно много гуглил в течение нескольких часов, прежде чем спрашивать об этом здесь, и я совершенно отчаялся, если решил опубликовать здесь.

У меня есть несколько строк сследующий формат (приблизительно):

"firstword text ONE lastword"
"firstword text TWO lastword"

Мне нужно извлечь text после 'firstword' и до 'ONE' или 'TWO'.

Так что мой вывод длявышеупомянутые строки должны быть:

"text"

Как разделить или разбить строку, чтобы я мог:

  • удалить первое слово (я уже знаю, как это сделать сstr.split (''))
  • сохранить текст, который предшествует любому из «ONE» или «TWO».(Я думал, что это должно было выглядеть примерно как str.split ('ONE' | 'TWO'), но это явно не работает, и мне не удалось найти решение прямо сейчас.

Если возможно, я бы хотел решить эту проблему с помощью split() или partition(), но с регулярным выражением тоже все будет в порядке.

Спасибо за вашу помощь и извините, если это глупый вопрос.

Ответы [ 5 ]

0 голосов
/ 19 ноября 2018

На самом деле нет необходимости использовать регулярные выражения. Вы можете сохранить требуемые разделители в списке и затем проверить, существуют ли они.

orig_text = "firstword text ONE lastword"

first_separator = "firstword"
#Place all "end words" here
last_separators = ["ONE", "TWO"]

output = []

#Splitting the original text into list
orig_text = orig_text.split(" ")

#Checking if there's the "firstword" just in case
if first_separator in orig_text:
    #Here we check if there's "ONE" or "TWO" in the text
    for i in last_separators:
        if i in orig_text:
            #taking everything between "firstword" and "ONE"/"TWO"
            output = orig_text[orig_text.index(first_separator)+1 : orig_text.index(i)]
            break

#Converting to string
output = " ".join(output)

print(output)

Вот пример выходных данных:

"firstword text TWO lastword" -> "text"
"firstword hello world ONE" -> "hello world"
"first text ONE" -> ""
"firstword text" -> ""
0 голосов
/ 19 ноября 2018

Вы можете использовать регулярные выражения, такие как:

import re
string = "firstword text TWO lastword"
re.search('firstword\s+(\w+)\s+[ONE|TWO]', string).group(1)
'text'
0 голосов
/ 19 ноября 2018

Когда вы разделите его на пробел, у вас будет список всех слов, тогда вы сможете выбрать, какое слово вы хотите:

s = "firstword text TWO lastword"
l = s.split(" ") # l = ["firstword" , "text" , "TWO" , "lastword"]
print l[1] # l[1] = "text"

или

s = "firstword text TWO lastword"
print s.split(" ")[1]
0 голосов
/ 19 ноября 2018

Попробуйте это

str_list = ["firstword text ONE lastword","firstword text TWO lastword","any text u entered before firstword text ONE","firstword text TWO any text After"]
end_key_lst = ['ONE','TWO']
print map(lambda x:x.split('firstword')[-1].strip(),[''.join(val.split(end_key)[:-1]) for val in str_list for i,end_key in enumerate(end_key_lst) if end_key in val.split()])

Result:['text', 'text', 'text', 'text']

Как я могу это сделать: Пусть у вас будет такое количество строк, поэтому я сохранил их в списке и расположил наши конечные ключи, например, ОДИН, ДВА в одном списке.Я использую функцию сжатия списка и карты, чтобы получить желаемый список целей.

0 голосов
/ 19 ноября 2018

Вы можете использовать это регулярное выражение, которое делает положительный прогноз и позитивный взгляд позади,

(?<=firstword)\s*(.*?)\s*(?=ONE|TWO)

Демо

Объяснение:

  • (?<=firstword) -> Позитивный взгляд позади, чтобы убедиться, что за сопоставленным текстом следует первое слово
  • \s* -> Съедает любой пробел
  • (.*?)-> Захватывает ваши предполагаемые данные
  • \s* -> Съедает любые пробелы
  • (?=ONE|TWO) -> Позитивный взгляд вперед, чтобы убедиться, что за сопоставленным текстом следует ОДИН или ДВУХ
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...