Найти несколько вхождений строки между двумя строками в столбце текста в пандах - PullRequest
0 голосов
/ 13 июня 2019

У меня есть датафрейм с одним текстовым столбцом. Один из примеров выглядит следующим образом -

line = 'user : hi\nassistant : hi , good evening. how can i help you?\n \n \nuser : order status\nassistant : please enter your case id here. \n \nuser : 0023201. \nassistant : order number: 0023201 \norder amount: 22.5 USD \nplace: oregon \nuser : order status\nassistant : please enter your case id here. \n \nuser : 0023210. \nassistant : order number: 0023210 \norder amount: 18.5 USD \nplace: iowa \n \n'

Я хочу извлечь информацию о номере заказа, сумме заказа и разместить его в трех отдельных столбцах. Как то так -

df = pd.DataFrame([['some info','some info','text_column',['0023201','0023210'],['22.5','18.5'],['USD','USD'],['oregon','iowa']]], columns=['col1','col2','col3','col4','col5','col6','col7'])

Я пытался использовать модуль 're', но ничего не смог сделать.

str1 = 'number:'
str2 = 'amount:'
t2 = []
for i in data['text_column']:
    text = i
    reg = "(?<=%s).*?(?=%s)" % (str1,str2)
    r = re.compile(reg,re.DOTALL)
    result = r.findall(r,text)
    t2.append(result)

Пожалуйста, помогите, поскольку я новичок в Python.

1 Ответ

0 голосов
/ 14 июня 2019

Вы можете использовать

(?s)user\s*:\s*(\d{7}).*?order amount:\s*(\d[\d.,]*) *([A-Z]+).*?place:\s*([^\r\n]+)

См. Демоверсию regex

Детали

  • (?s) - модификатор DOTALL, позволяющий . совпадать между строками
  • user - буквенная строка
  • \s*:\s* - : заключено в 0+ пробелов
  • (\d{7}) - Группа 1 : семь цифр
  • .*? - любой текст до первого ...
  • order amount: - текст
  • \s* - 0+ пробелов
  • (\d[\d.,]*) - Группа 2 : цифра, а затем 0+ цифр, запятых или точек
  • * - 0 или более пробелов
  • ([A-Z]+) - Группа 3 : 1+ заглавные буквы
  • .*? - любой текст до первого ...
  • place: - подстрока
  • \s* - 0+ пробелов
  • ([^\r\n]+) - Группа 4 : любые 1+ символов, кроме LF / CR
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...