Регулярное выражение получает идентификатор из закрытых скобок

#python #regex #regex-group

Вопрос:

Я получал данные от Microsoft об их планах, вот веб-страница для справки данных

https://docs.microsoft.com/en-us/azure/active-directory/enterprise-users/licensing-service-plan-reference#feedback

Я работаю над данными таблицы, чтобы получить соответствующие продукты с их идентификатором 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