Извлечение конкретного шаблона из строки в Python - PullRequest
1 голос
/ 06 марта 2019

У меня есть данные ниже в столбце Dataframe (содержит около 100 строк).

Необходимо извлекать строку CK (CK-36799-1523333) из DF для каждой строки.

  • Примечание.1006 *

Данные:

{"currency":"US","Cost":129,"receipt_id":"CK-36799-1523333","af_customer_user_id":"33738413"}

{"currency":"INR","Cost":429,"receipt_id":"CK-33711-15293046","af_customer_user_id":"33738414"}

{"currency":"US","Cost":229,"receipt_id":"CK-36798-1523333","af_customer_user_id":"33738423"}

{"currency":"INR","Cost":829,"receipt_id":"CK-33716-152930456","af_customer_user_id":"33738214"}

  {"currency":"INR","Cost":829,"order_id":"CK-33716-152930456","af_customer_user_id":"33738214"}

  {"currency":"INR","Cost":829,"suborder_id":"CK-33716-152930456","af_customer_user_id":"33738214"}

Результат

CK-36799-1523333
CK-33711-15293046
CK-36798-1523333
CK-33716-152930456

Я пытался использовать функцию str.find ('CK-'), но не получил ожидаемый результат. Необходимые предложения

Ответы [ 3 ]

0 голосов
/ 06 марта 2019

Попробуйте использовать регулярные выражения

import re

...
for line in data:
    res = re.findall(r"CK\-[0-9]+\-[0-9]+", line)
    if len(res) != 0:
        print(res[0])
0 голосов
/ 06 марта 2019

Предположим, это CSV-файл, и мы можем найти его следующим образом.

import re

pattern = re.compile(r'CK-36799-1523333)')
ck_list = []

with open('ck.csv', 'r') as f:  ## where ck.csv is the file you shared above
    for i in f:
        if pattern.search(i):
            ck_list.append(i.split(',')[0].strip())
0 голосов
/ 06 марта 2019

Использование Series.str.extract:

df['new'] = df['col'].str.extract(r"(CK\-\d+\-\d+)", expand=False).fillna('no match')
print (df)
                                                 col                 new
0  {"currency":"US","Cost":129,"receipt_id":"CK-3...    CK-36799-1523333
1  {"currency":"INR","Cost":429,"receipt_id":"CK-...   CK-33711-15293046
2  {"currency":"US","Cost":229,"receipt_id":"CK-3...    CK-36798-1523333
3  {"currency":"INR","Cost":829,"receipt_id":"CK-...  CK-33716-152930456
4    {"currency":"INR","Cost":829,"order_id":"CK-...  CK-33716-152930456
5    {"currency":"INR","Cost":829,"suborder_id":"...  CK-33716-152930456

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

import ast

f = lambda x: next(iter(v for v in ast.literal_eval(x).values() 
                        if str(v).startswith('CK-')), 'no match')
df['new'] = df['col'].apply(f)
...