У меня есть журнал вызовов обслуживания клиентов на листе excel. Ниже приведен формат данных, которые я имею
So# Comments
1 sjhsh QUOTE 234566
1 sdsds customer call QUote 239876 Call back
2 adsdfh unknown call from customer QUOTE 189067 sdkjsd woieweio
3 QUOTE 657894 customer called for service
Я читаю эти данные из excel и вам нужно получить 6 цифр по тексту "QUOTE" в каждой строке, а затем добавить извлеченные цифры в качестве нового столбца
1. Строки могут содержать несколько упоминаний "QUOTE". 2. Строки могут вообще не иметь "QUOTE"
Может кто-то, пожалуйста, помогите мне с этим поиском подстроки, используя python
import pandas as pd
import re
file=pd.read_excel("C:/Users/rkatta/Desktop/Book1.xlsx")
file.set_index('Index', inplace=True, drop=True)
comments=file['InternalComments']
quotenum=[]
keyword= 'QUOTE'
for i in comments:
try:
befor_keyowrd, keyword, after_keyword = comments[i].partition(keyword)
num=after_keyword[:6]
quotenum.append(num)
except AttributeError:
befor_keyowrd, keyword, after_keyword =''
quotenum.append(after_keyword)
Вам нужно заменить часть обработки столбцов следующей строкой:
file['InternalComments'] = file['Comments'].str.findall(r'(?i)quote\s+(\d+)').apply(','.join)
См. Демо-версию regex.
Регулярное выражение соответствует:
(?i)
- нечувствительный к регистру режимquote
- подстрока quote
\s*
- 0+ пробелы(\d+)
- Захват группы 1 (то, что возвращается findall
): цифры 1+.См. Демонстрацию кода Python:
from pandas import DataFrame
import pandas as pd
l = ['sjhsh QUOTE 234566', 'sdsds customer call QUote 239876 Call back', 'adsdfh unknown call from customer QUOTE 189067 sdkjsd woieweio', 'QUOTE 657894 customer called for service', 'QUOTE 657894 customer called for service QUOTE 657894 customer called for service', 'No qte']
file = pd.DataFrame(l, columns=['Comments'])
file['InternalComments'] = file['Comments'].str.findall(r'(?i)quote\s*(\d+)').apply(','.join)
file
Comments InternalComments
0 sjhsh QUOTE 234566 234566
1 sdsds customer call QUote 239876 Call back 239876
2 adsdfh unknown call from customer QUOTE 189067... 189067
3 QUOTE 657894 customer called for service 657894
4 QUOTE 657894 customer called for service QUOTE... 657894,657894
5 No qte
(?i)(?<=QUOTE )\d+
захватит номера, которые вы ищете.
(?i)
означает, что остальная часть шаблона нечувствительна к регистру, поэтому он будет соответствовать "QUOTE" и любому варианту слова.
(?<=QUOTE )
означает, что цифрам будет предшествовать слово quote и пробел
\d+
- ваш номер
(?<=QUOTE )
взгляд назад.
df['your_cal'].str.extractall(r"(\d+)")
? Илиdf['your_col'].str.findall(r'\d+').apply(','.join)
?Quote
всегда в верхнем регистре? Все кавычки 6 цифр или больше?