#python #regex #regex-group
Вопрос:
Я получал данные от Microsoft об их планах, вот веб-страница для справки данных
Я работаю над данными таблицы, чтобы получить соответствующие продукты с их идентификатором guid изначально для первого столбца это было легко, но для последнего они просто использовали теги разрыва в нем. Вот мой код для этого.
import requests
from requests.api import head
from bs4 import BeautifulSoup
import pandas as pd
import json
import re
url = "https://docs.microsoft.com/en-us/azure/active-directory/enterprise-users/licensing-service-plan-reference#feedback"
payload = {}
headers = {}
response = requests.request("GET", url, headers=headers, data=payload)
soup = BeautifulSoup(response.content, 'lxml')
table = soup.find( "table" )
df = pd.read_html(str(table))[0]
df = df.drop(labels=['Service plans included'],
axis='columns')
json_dict = json.loads(df.to_json(orient='records'))
regex = r"([A-Z ] (.*?))"
microsoft_processed_data = []
for item in json_dict:
plan_data = item["Service plans included (friendly names)"]
matches = re.findall(regex, plan_data)
dict = {}
for match in matches:
dict_key = match.split("(", )[1]
dict_key = dict_key.replace(")", "")
dict_value = match.split(" (")[0]
print(dict_key " : " dict_value)
dict[dict_key] = dict_value
item["Service plans included (friendly names)"] = dict
microsoft_processed_data.append(item)
with open('data.json', 'w') as f:
json.dump(microsoft_processed_data, f, indent = 4)
Это работало до тех пор, пока они также не начали использовать скобки в своих названиях планов, и мое регулярное выражение не вышло из строя, которое работало в группе.
Если мы рассмотрим этот пример строки из всех
ОБМЕН ОНЛАЙН (ПЛАН 1) (9aaf7827-d63c-4b61-89c3-182f06f82e5c)
затем, согласно моему регулярному выражению, он собирал текст, начиная с начала и заканчивая закрытыми скобками.
итак, мое регулярное выражение мои собранные данные до > EXCHANGE ONLINE (ПЛАН 1)
Но я хочу получить данные до идентификатора guid, а затем отделить имя для словаря.
Вот мой пример ожидаемого словаря
{
"EXCHANGE ONLINE (PLAN 1)" : "9aaf7827-d63c-4b61-89c3-182f06f82e5c"
}
Ответ №1:
([A-Z,0-9,-,(,),s s*(.*?))
Это регулярное выражение работает просто идеально, если кто-нибудь также посмотрит на набор данных в будущих лицензиях Microsoft Office 365, затем используйте его в своем обходчике, чтобы получить все сублицензии для каждого типа лицензий.
Ответ №2:
Попробуйте: regex = r"([A-Z ] (.*?))s*((.*?))"
, Это даст кортеж значений, которые вы ищете.
Давайте сосредоточимся s*((.*?))
только на части
- s* будет соответствовать любому количеству символов пробела
- Затем
((.*?))
возьмем любую вещь между круглыми скобками.
re.findall(regex, text)
[('EXCHANGE ONLINE (PLAN 1)', '9aaf7827-d63c-4b61-89c3-182f06f82e5c')]
Вы можете напрямую передать его dict
, если хотите создать из него словарь:
dict(re.findall(regex, text))
{'EXCHANGE ONLINE (PLAN 1)': '9aaf7827-d63c-4b61-89c3-182f06f82e5c'}
Комментарии:
1. Для некоторых это работает, но для большинства это не удается, вот что я получил, это смешало 2 в одно.
('MICROSOFT DEFENDER FOR ENDPOINT (871d91ec-ec1a-452b-a83f-bd76c7d770ef)Windows 10 Enterprise (New)', 'e7c91390-7625-45be-94e0-e16907e03118')
2. Вам необходимо предоставить достаточные примеры данных, регулярное выражение отлично работает для предоставленных данных.
3. Просто обновил мой полный код вместе с запросом, который предоставит все данные.
4. Добавление ссылки на данные pastebin pastebin.com/mBwDFf09