Pandas: str извлекает текст каждую вещь, кроме последней части строки - PullRequest
0 голосов
/ 27 марта 2020

У меня есть фрейм данных со столбцом, известным как «msg».

В столбце «msg» все строки выглядят примерно так, как показано ниже. Пользователь xxxx имеет длину 6 или 7 символов. xx.xx.xx.xx и yy.yy.yy.yy являются IP-адресами, поэтому каждый октет может быть 1 ди git или 3 цифрами.

User xxxxxx is attempting to restart primary host xxx.xx.xxx.xx (id=1) for managed host yyy.yy.yyy.yy (id=4) at Dec 30, 2019, 6:08:87 PM

Мне нужно правило для извлечения всего в каждом ячейка перед "в De c 30, 2019, 6:08:87 вечера"? т.е. я хочу отбросить все символы после "at \ w \ w \ w \ d \ d, \ d \ d \ d \ d, \ d: \ d \ d: \ d \ d ....."

Мой текущий код, как показано ниже, но я не уверен, как заполнить пат.

Test = df['msg'].str.extract(pat='...')

Ответьте на комментарии ниже: Мэтью: да. Формат после 2-го (id = xx) одинаков. Джон: в любом случае это нормально.

Ответы [ 3 ]

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

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

Test = df['msg'].str.extract(pat='^.*(?=\s+at [A-Za-z]{3} \d{2}, \d{4}, [\d:]+ (?:AM|PM)$)')

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

Демо

1 голос
/ 27 марта 2020

Пожалуйста, попробуйте

df.msg.str.extractall('(?<=\s)([a-z]*\s[A-Z0-9]\S*\s[0-9,].+)')

Объяснение

(?<=\s) Любое выражение после пробела, за которым следуют строчные буквы и пробелы [a-z]*\s и прописные буквы alphanumeri c[A-Z0-9] и alphanumeri c может совпадать с непробельным символом \S и может жадно совпадать со строкой пробела слева от нуля или несколько раз *\s, а также может содержать строки с цифрами от 0-9 до запятой [0-9,], и если этот шаблон существует, совпадают с теми символами, за исключением жадных символов до левого нуля или многократно

1 голос
/ 27 марта 2020
string='I ate an apple (id=1) and an orange (id=4) at Dec 30, 2019, 6:08:87 PM'
string = string[:string.rfind('at')]

Здесь, я думаю, слово «в» должно быть до даты. Поэтому я нашел last_occurence 'at' с помощью rfind () и нарезал строку

...