Мой текст

my_text = '"posted_data":"2e54eba66f8f2881c8e78be8342428xd","isropa":false,"rx":"NO","readal":"false"'

Я пытаюсь извлечь значение posted_data, то есть 2e54eba66f8f2881c8e78be8342428xd

Мой код:

extract_posted_data = re.search(r'(\"posted_data\": \")(\w*)', my_text)
print (extract_posted_data)

И он печатает None

Спасибо

2
elrich bachman 1 Мар 2018 в 23:03

4 ответа

Лучший ответ

Это потому, что в вашем исходном коде есть дополнительный пробел. Так должно быть:

extract_posted_data = re.search(r'(\"posted_data\":\")(\w*)', my_text)

И на самом деле '\' здесь не нужен. Только:

extract_posted_data = re.search(r'("posted_data":")(\w*)', my_text)

Затем:

extract_posted_data.group(2)

Это то, что вы хотите.

>>> my_text = '"posted_data":"2e54eba66f8f2881c8e78be8342428xd","isropa":false,"rx":"NO","readal":"false"'
>>> extract_posted_data = re.search(r'("posted_data":")(\w*)', my_text)   
>>> extract_posted_data.group(2)
'2e54eba66f8f2881c8e78be8342428xd'
1
elrich bachman 1 Мар 2018 в 21:12

Этот конкретный пример совсем не нуждается в регулярных выражениях.

>>> my_text
'"posted_data":"2e54eba66f8f2881c8e78be8342428xd","isropa":false,"rx":"NO","readal":"false"'
>>> import json
>>> result = json.loads('{%s}' % my_text)
>>> result
{'posted_data': '2e54eba66f8f2881c8e78be8342428xd', 'isropa': False, 'rx': 'NO', 'readal': 'false'}
>>> result['posted_data']
'2e54eba66f8f2881c8e78be8342428xd'

С BeautifulSoup:

>>> import json
... 
... from bs4 import BeautifulSoup
... 
... soup = BeautifulSoup('<script type="text/javascript"> "posted_data":"2738273283723hjasda" </script>')
... 
... result = json.loads('{%s}' % soup.script.text)
>>> result
{'posted_data': '2738273283723hjasda'}
>>> result['posted_data']
'2738273283723hjasda'
3
G_M 1 Мар 2018 в 20:47

Как уже упоминали другие, json будет лучшим инструментом для этих данных, но вы также можете использовать это регулярное выражение (я добавил \ s * на случай, если в будущем между ними будут пробелы):

Регулярное выражение: "posted_data":\s*"(?P<posted_data>[^"]+)"

import re

my_text = '"posted_data":"2e54eba66f8f2881c8e78be8342428xd","isropa":false,"rx":"NO","readal":"false"'
m = re.search(r'"posted_data":\s*"(?P<posted_data>[^"]+)"', my_text)
if m:
    print(m.group('posted_data'))
1
Totoro 1 Мар 2018 в 20:52

Вам нужно изменить свое регулярное выражение, чтобы использовать обходные пути, как показано ниже:

my_text = '"posted_data":"2e54eba66f8f2881c8e78be8342428xd","isropa":false,"rx":"NO","readal":"false"'
extract_posted_data = re.search(r'(?<="posted_data":")\w*(?=")', my_text)
print (extract_posted_data[0])

Prints 2e54eba66f8f2881c8e78be8342428xd

Также re.search() возвращает объект Match, поэтому, чтобы получить первое совпадение (единственное совпадение), вы получите индекс 0 совпадения:

1
DBedrenko 1 Мар 2018 в 20:06