Цель: запросить в столбце данных pandas текстовую фразу, которая может содержать или не содержать слова в этой фразе. На высоком уровне фраза "word1 word2". Между словом 1 и словом 2 могут быть или не быть другие слова.
Это звучит как дурак, однако я попробовал ТАК ответы здесь:
Как извлечь подстроку из строки в Python?
Регулярное выражение: сопоставление и группировка переменного числа слов, разделенных пробелом
Соответствует тексту между двумя строками с регулярным выражением
Извлечение текстовой информации между двумя определенными текстами
И несколько других, и все они пропускают случай, когда между словами 1 и 2 нет слов.
Все эти высоко оцененные решения опираются (. +?) Между word1 и word2.
Пример: слово1 (. +?) Слово2
Вышеприведенное работает хорошо, если между word1 и word2 есть 1+ слова. Однако, если между word1 и word2 нет слов NO, то он не возвращает никаких результатов, однако я хотел бы, чтобы он возвращал результаты и в этом конкретном случае, потому что текстовая фраза содержит word1 word2.
Кроме того, данные будут очищены заранее, поэтому нет необходимости учитывать заглавные буквы, запятые или другие ложные символы.
Мой код и испытания приведены ниже. Вместо word1 word2 я использую «кусочки доставлены» в качестве текстовой фразы.
Обратите внимание, что все они пропускают первый пример, в котором нет промежуточных слов между "доставленными частями". Он должен возвращать «некоторые части доставлены вовремя» вместе с другими строками с «частями ... доставлены».
Заранее спасибо.
import pandas as pd
df = pd.Series(['a', 'b', 'c', 'some pieces delivered on time', 'all pieces not delivered', 'most pieces were never delivered at all', 'the pieces will never ever be delivered', 'some delivered', 'i received broken pieces'])
print("Baseline - Desired results SHOULD contain:\n", df.iloc[3:7])
# The following options all miss one or more rows from the desired results.
# Just uncomment rgx = to run a regex.
rgx = r'pieces\s(.*?)\sdelivered'
#rgx = r'pieces\s(\w*)\sdelivered'
#rgx = r'pieces\s(\w*)+\sdelivered'
#rgx = r'pieces\s(\w)*\sdelivered'
#rgx = r'pieces\s(\w+\s)+\sdelivered'
#rgx = r'pieces\s(.*)\sdelivered'
#rgx = r'pieces\s+((%s).*?)\sdelivered'
df2 = df[df.str.contains(rgx)]
print("\nActual results were:\n", df2)