Python регулярное выражение: создать pandas Dataframe с JavaScript строками нового массива () - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь повторить ответ Javascript, чтобы построить pandas Dataframe. Я начинаю с регулярных выражений и JS, поэтому может быть очевидное улучшение, чтобы сделать код более надежным. Javascript ответ, верните следующую строку:


    mmSuggestDeliver(0, new Array("Name", "Category", "Keywords", "Bias", "Extension", "IDs"), new Array(new Array("HSBC Holdings plc (Spons. ADRs)", "Stocks", "HSBC|US4042804066|HSBC||", "75", "", "hsbc|HSBC|1|4917"),new Array("HSBC Holdings plc", "Stocks", "|GB0005405286|||HSBA", "75", "", "hsbc-gb0005405286||1|1046"),new Array("HSBC Trinkaus & Burkhardt AG", "Stocks", "|DE0008115106|||TUBG", "75", "", "hsbc_trinkausburkhardt||1|3774"),new Array("HSBC Bank Malta Plc Registered Shs", "Stocks", "|MT0000030107|||", "75", "", "hsbc_bank_malta||1|16831644"),new Array("HSBC-D7 SA de CV SIID (A)", "Stocks", "|MX51HS0Q00E8|||", "75", "", "hsbc-d7||1|5125971"),new Array("HSBC US Buy-Out GmbH & Co. KGaA", "Stocks", "|DE000A0MM6H7|||", "75", "", "hsbc_us_buy-out_gmbhco||1|23145"),new Array("HSBC Holdings PLC ADR Cert Deposito Arg Repr 0.5 ADRs", "Stocks", "|ARDEUT112257|||", "75", "", "hsbc_2||1|1399269"),new Array("HSBC Holdings PLC6.2 % Pfd Shs Sponsored American Deposit Repr 1/40th 6.2 % PfdShs Ser -A-", "Stocks", "HSBC.PA|US4042806046|HSBC.PA||", "75", "", "hsbc-pa|HSBC.PA|1|19327"),new Array("HSBC Holdings PLC 8 % Perp Sub Cap Secs 2010-Without Fixed Maturity Series -2-", "Stocks", "HSEB|US4042808026|HSEB||", "75", "", "hseb|HSEB|1|5083319"),new Array("HSBC Holdings PLC 8 1-8 % Perpetual Sub Cap Secs 2008-Exch into Non-Cum Dollar Pref Shs", "Stocks", "HSEA|US4042807036|HSEA||", "75", "", "hsea|HSEA|1|3782270")), 10, 0);

Я хочу организовать данные как таблицу ниже, но без двойной кавычки:


    "Name", "Category", "Keywords", "Bias", "Extension", "IDs"
    "HSBC Holdings plc (Spons. ADRs)", "Stocks", "HSBC|US4042804066|HSBC||", "75", "", "hsbc|HSBC|1|4917"
    "HSBC Holdings plc", "Stocks", "|GB0005405286|||HSBA", "75", "", "hsbc-gb0005405286||1|1046")
    ......
    "HSBC Holdings PLC 8 % Perp Sub Cap Secs 2010-Without Fixed Maturity Series -2-", "Stocks", "HSEB|US4042808026|HSEB||", "75", "", "hseb|HSEB|1|5083319"
    "HSBC Holdings PLC 8 1-8 % Perpetual Sub Cap Secs 2008-Exch into Non-Cum Dollar Pref Shs", "Stocks", "HSEA|US4042807036|HSEA||", "75", "", "hsea|HSEA|1|3782270"

В идеале я хотел бы получить конечный результат в pandas Dataframe.

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

код для получения имен столбцов:

    js_text = """
mmSuggestDeliver(0, new Array("Name", "Category", "Keywords", "Bias", "Extension", "IDs"), 
new Array(new Array("HSBC Holdings plc (Spons. ADRs)", "Stocks", "HSBC|US4042804066|HSBC||", "75", "", "hsbc|HSBC|1|4917"),
new Array("HSBC Holdings plc", "Stocks", "|GB0005405286|||HSBA", "75", "", "hsbc-gb0005405286||1|1046"),
new Array("HSBC Trinkaus & Burkhardt AG", "Stocks", "|DE0008115106|||TUBG", "75", "", "hsbc_trinkausburkhardt||1|3774"),
new Array("HSBC Bank Malta Plc Registered Shs", "Stocks", "|MT0000030107|||", "75", "", "hsbc_bank_malta||1|16831644"),
new Array("HSBC-D7 SA de CV SIID (A)", "Stocks", "|MX51HS0Q00E8|||", "75", "", "hsbc-d7||1|5125971"),
new Array("HSBC US Buy-Out GmbH & Co. KGaA", "Stocks", "|DE000A0MM6H7|||", "75", "", "hsbc_us_buy-out_gmbhco||1|23145"),
new Array("HSBC Holdings PLC ADR Cert Deposito Arg Repr 0.5 ADRs", "Stocks", "|ARDEUT112257|||", "75", "", "hsbc_2||1|1399269"),
new Array("HSBC Holdings PLC6.2 % Pfd Shs Sponsored American Deposit Repr 1/40th 6.2 % PfdShs Ser -A-", "Stocks", "HSBC.PA|US4042806046|HSBC.PA||", "75", "", "hsbc-pa|HSBC.PA|1|19327"),new Array("HSBC Holdings PLC 8 % Perp Sub Cap Secs 2010-Without Fixed Maturity Series -2-", "Stocks", "HSEB|US4042808026|HSEB||", "75", "", "hseb|HSEB|1|5083319"),new Array("HSBC Holdings PLC 8 1-8 % Perpetual Sub Cap Secs 2008-Exch into Non-Cum Dollar Pref Shs", "Stocks", "HSEA|US4042807036|HSEA||", "75", "", "hsea|HSEA|1|3782270")), 10, 0);
    """

    regex_text = r"new Array\((.*)\)"
    column_header = _re.search(regex_text, js_text, flags=_re.MULTILINE).group(1)
    regex_text = ', (?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)'
    column_header = _re.split(regex_text, column_header, flags=_re.MULTILINE)
    print('regex1:', column_header)

, который печатает: regex1: ['"Name"', '"Category"', «Ключевые слова», «смещение», «расширение», «идентификаторы»] сложное сочетание одинарных и двойных кавычек ...

код для получения данных:

    regex_text = r"new Array\(([\s\S]*?)\),"
    table_rows = _re.findall(regex_text, js_text, flags=_re.MULTILINE)
    table_rows.pop(0)
    table_rows[0] = str(table_rows[0]).replace('new Array(', '')

    my_data = []
    regex_text = ', (?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)'

    for my_row in table_rows:
        my_row = _re.split(regex_text, my_row, flags=_re.MULTILINE)
        print('row is:', my_row)
        my_data.append(my_row)
    result_df = _pd.DataFrame(data=my_data, columns=column_header)
    print(result_df)
    print(result_df.dtypes)


, которые печатают огромный DF как:

                                                  "Name"  ...                               "IDs"
    0                  "HSBC Holdings plc (Spons. ADRs)"  ...                  "hsbc|HSBC|1|4917"
    1                                "HSBC Holdings plc"  ...         "hsbc-gb0005405286||1|1046"
    2                     "HSBC Trinkaus & Burkhardt AG"  ...    "hsbc_trinkausburkhardt||1|3774"
    3               "HSBC Bank Malta Plc Registered Shs"  ...       "hsbc_bank_malta||1|16831644"
    4                        "HSBC-D7 SA de CV SIID (A)"  ...                "hsbc-d7||1|5125971"
    5                  "HSBC US Buy-Out GmbH & Co. KGaA"  ...   "hsbc_us_buy-out_gmbhco||1|23145"
    6  "HSBC Holdings PLC ADR Cert Deposito Arg Repr ...  ...                 "hsbc_2||1|1399269"
    7  "HSBC Holdings PLC6.2 % Pfd Shs Sponsored Amer...  ...           "hsbc-pa|HSBC.PA|1|19327"
    8  "HSBC Holdings PLC 8 % Perp Sub Cap Secs 2010-...  ...               "hseb|HSEB|1|5083319"
    9  "HSBC Holdings PLC 8 1-8 % Perpetual Sub Cap S...  ...              "hsea|HSEA|1|3782270")


    [10 rows x 6 columns]
    "Name"          object
     "Category"     object
     "Keywords"     object
     "Bias"         object
     "Extension"    object
     "IDs"          object
    dtype: object

Код данных имеет множество предостережений, в том числе:

  1. , если часть "new Array" JS имеет больше / меньше пробелов, код не найдет строку. Сначала я использовал start end fo regex, но затем возникла другая проблема, когда между "," и "new Array" не было пробела: regex: "new Array (\" (. *)) "
  2. all значения заключены в двойные кавычки
  3. это выглядит не очень питонски ...

Спасибо за помощь!

Пока я смотрел следующие ссылки среди других :

введите описание ссылки здесь

введите описание ссылки здесь

введите описание ссылки здесь

1 Ответ

0 голосов
/ 10 февраля 2020

Попробуйте найти в al oop (пока нет совпадений) следующее регулярное выражение для вашей входной строки:

\bnew\s+Array\s*[(]\s*(".*?)(?=[)]\s*,\s*new\s+Array|\s*[)]\s*[)]\s*[^(]+$)

Затем для каждой итерации получите первую группу захвата.

Первая итерация должна получить заголовок, в то время как следующие итерации должны получить данные.

У вас есть демо здесь (выделение зеленым цветом - это данные, которые вы сохранили бы в первой группе захвата)

Если R поддерживает \K, это еще одна альтернатива, которая может работать для вас:

\bnew\s+Array\s*[(]\s*\K"(?:[^"\\]+|\\.)*"\s*(?:,\s*"(?:[^"\\]++|\\.)*")+

В этом случае вам не нужно использовать группы захвата. Все данные будут совпадать.

У вас есть демо здесь для второго подхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...