Как захватить и разделить тексты с помощью регулярных выражений в Python - PullRequest
1 голос
/ 22 сентября 2019

Я пытаюсь сгенерировать кадр данных из набора данных в текстовом формате.Текстовый файл имеет следующий формат

product/productId: B000JVER7W
product/title: Mobile Action MA730 Handset Manager - Bluetooth Data Suite
product/price: unknown
review/userId: A1RXYH9ROBAKEZ
review/profileName: A. Igoe
review/helpfulness: 0/0
review/score: 1.0
review/time: 1233360000
review/summary: Don't buy!
review/text: First of all, the company took my money and sent me an email telling me the product was shipped. A week and a half later I received another email telling me that they are sorry, but they don't actually have any of these items, and if I received an email telling me it has shipped, it was a mistake.When I finally got my money back, I went through another company to buy the product and it won't work with my phone, even though it depicts that it will. I have sent numerous emails to the company - I can't actually find a phone number on their website - and I still have not gotten any kind of response. What kind of customer service is that? No one will help me with this problem. My advice - don't waste your money!

product/productId: B000JVER7W
product/title: Mobile Action MA730 Handset Manager - Bluetooth Data Suite
product/price: unknown
review/userId: A7L6E1KSJTAJ6
review/profileName: Steven Martz
review/helpfulness: 0/0
review/score: 5.0
review/time: 1191456000
review/summary: Mobile Action Bluetooth Mobile Phone Tool Software MA-730
review/text: Great product- tried others and this is a ten compared to them. Real easy to use and sync's easily. Definite recommended buy to transfer data to and from your Cell.

Поэтому мне нужно сгенерировать кадр данных, в котором все ProductID, Title, Price и т. Д. Представлены в виде заголовков столбцов и соответствующих данных в каждой записи.

Итак, последний требуемый кадр данных -

ID          Title                        Price      UserID          ProfileName     Helpfulness     Score   Time        summary
B000JVER7W  Mobile Action MA730          unknown    A1RXYH9ROBAKEZ  A. Igoe         0/0             1.0     1233360000  Don'tbuy!               
            Handset Manager - Bluetooth 
            Data Suite

и т. Д. Для всех деталей обзора, которые находятся в наборе данных с использованием регулярных выражений.Поскольку я новичок в регулярных выражениях, я не могу выполнить эту операцию.Я попытался сделать (предполагая, что переменная набора данных состоит из всего содержимого текстового файла)

pattern = "product\productId:\s(.*)\s"
a = re.search(pattern, dataset)

Делая это, я получаю ouptput

>> a.group(1)
 "B000JVER7W product/title: Mobile Action MA730 Handset Manager - Bluetooth Data Suite product/price: unknown review/userId: A1RXYH9ROBAKEZ review/profileName: A. Igoe review/helpfulness: 0/0 review/score: 1.0 review/time: 1233360000 review/summary: Dont buy! review/text: First of all, the company took my money and sent me an email telling me the product was shipped. A week and a half later I received another email telling me that they are sorry, but they don't actually have any of these items, and if I received an email telling me it has shipped, it was a mistake.When I finally got my money back, I went through another company to buy the product and it won't work with my phone, even though it depicts that it will. I have sent numerous emails to the company - I can't actually find a phone number on their website - and I still have not gotten any kind of response. What kind of customer service is that? No one will help me with this problem. My advice - don't waste your money!"

Но то, что я хочу, это

>> a.group(1)
"["B000JVER7W", "A000123js" ...]"

и аналогично для всех полей.

Возможно ли указанное выше требование, если оно есть, как это сделать

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 22 сентября 2019

Вы можете сделать это даже без каких-либо регулярных выражений, создав словарь и затем используя pandas.Dataframe().

Попробуйте:

import pandas as pd

with open("your_file_name") as file:
    product_details = file.read().split("\n\n")

product_dict = {"ID":[],"Title":[],"Price":[],"UserID":[],
                "ProfileName":[],"Helpfulness":[],"Score":[],"Time":[],"summary":[]}

for product in product_details:
    fields = product.split("\n")
    product_dict["ID"].append(fields[0].split(":")[1])
    product_dict["Title"].append(fields[1].split(":")[1])
    product_dict["Price"].append(fields[2].split(":")[1])
    product_dict["UserID"].append(fields[3].split(":")[1])
    product_dict["ProfileName"].append(fields[4].split(":")[1])
    product_dict["Helpfulness"].append(fields[5].split(":")[1])
    product_dict["Score"].append(fields[6].split(":")[1])
    product_dict["Time"].append(fields[7].split(":")[1])
    product_dict["summary"].append(fields[8].split(":")[1])

dataframe = pd.DataFrame(product_dict)
print(dataframe)

Вывод

Первая строка будет выглядеть так, как вы хотели:

ID          Title                        Price      UserID          ProfileName     Helpfulness     Score   Time        summary
B000JVER7W  Mobile Action MA730          unknown    A1RXYH9ROBAKEZ  A. Igoe         0/0             1.0     1233360000  Don'tbuy!               
            Handset Manager - Bluetooth 
            Data Suite
0 голосов
/ 22 сентября 2019

Используя Regex, он получает имена атрибутов динамически из самого текста:

from collections import defaultdict
import pandas as pd
import re

# first group is attribute, second groups is value
pattern = r'(?:product|review)/(\w+?)\:\s?(.+)'

records = defaultdict(list)
with open('data.txt', 'r', encoding='utf-8') as data:
    record = {}
    for line in data:
        line = line.strip()
        if line:
            attribute, value = re.search(pattern, line).groups()
            # format the The attribute name userId --> UserId,... etc
            attribute = attribute[0].upper() + attribute[1:] if attribute != 'productId' else 'ID'
            records[attribute].append(value.strip())

dataframe = pd.DataFrame(records)

Даже если в будущем вы добавите новые атрибуты, вам не нужно менять скрипт.

0 голосов
/ 22 сентября 2019

У вас есть опечатка в 'pattern', замените '\' на '/'.И используйте \ s * и findall:

pattern = r"product/productId:\s*(.*)\s*"
mo= re.findall(pattern,text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...