Я пытаюсь повторить ответ 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
Код данных имеет множество предостережений, в том числе:
- , если часть "new Array" JS имеет больше / меньше пробелов, код не найдет строку. Сначала я использовал start end fo regex, но затем возникла другая проблема, когда между "," и "new Array" не было пробела: regex: "new Array (\" (. *)) "
- all значения заключены в двойные кавычки
- это выглядит не очень питонски ...
Спасибо за помощь!
Пока я смотрел следующие ссылки среди других :
введите описание ссылки здесь
введите описание ссылки здесь
введите описание ссылки здесь