Как ограничить результаты регулярных выражений?Python

Программы на Python
Ответить
Anonymous
 Как ограничить результаты регулярных выражений?

Сообщение Anonymous »

Я пытаюсь извлечь твиты из огромного файла JSON, но мое регулярное выражение генерирует слишком много данных, и я не могу хоть убей понять, как его ограничить. Регулярное выражение находит то, для чего оно предназначено, но оно также помечает слишком много тегов.

Регулярное выражение, которое я использую, выглядит следующим образом (вероятно, более сложное, чем необходимо, но это не то, что меня интересует здесь):

(?:"contributors": .*?, "truncated": .*?, "text": ")([^R][^T].*?)"


Вот усеченная строка из файла JSON, которая генерирует слишком много данных, например:

{"contributors": null, "truncated": false, "text": "RT @BelloPromotions: Myke Towers Ft. Mariah - Desaparecemos\n@myketowers #myketowers #mariah @mariah #Desaparecemos #music #musica #musicanu\u2026", "is_quote_status": false, "in_reply_to_status_id": null, "id": 1099558111000506369, "favorite_count": 0, "entities": {"symbols": [], "user_mentions": [{"id": 943461023293542400, "indices": [3, 19], "id_str": "943461023293542400", "screen_name": "BelloPromotions", "name": "Bello Promotions \ud83d\udcc8\ud83d\udcb0"}, {"id": 729572008909000704, "indices": [60, 71], "id_str": "729572008909000704", "screen_name": "MykeTowers", "name": "Towers Myke"}, {"id": 775866464, "indices": [92, 99], "id_str": "775866464", "screen_name": "mariah", "name": "Kenzie peretti"}], "hashtags": [{"indices": [72, 83], "text": "myketowers"}, {"indices": [84, 91], "text": "mariah"}, {"indices": [100, 114], "text": "Desaparecemos"}, {"indices": [115, 121], "text": "music"}, {"indices": [122, 129], "text": "musica"}], "urls": []}, "retweeted": false, "coordinates": null, "source": "Music Twr Suggesting", "in_reply_to_screen_name": null, "in_reply_to_user_id": null, "retweet_count": 18, "id_str": "1099558111000506369", "favorited": false, "retweeted_status": {"contributors": null, "truncated": true, "text": "Myke Towers Ft. Mariah - Desaparecemos\n@myketowers #myketowers #mariah @mariah #Desaparecemos #music #musica\u2026 [link]", .......


В приведенном выше примере мое регулярное выражение выводит «myketowers», а затем второй экземпляр твита (исходный твит — после «retweeted_status»). Мне нужен только твит.

Вот код Python, который я запускаю (он не выдает никаких ошибок и делает именно то, что я хочу, даже слишком):

import re
import codecs

err_occur = []
pattern = re.compile(r'(?:"contributors": .*?, "truncated": .*?, "text": ")([^R][^T].*?)"')
input_filename = 'music_fixed.json'
tweets = open("tweets_380k.txt", "w")

try:
with codecs.open ('music_fixed.json', encoding='utf8') as in_file:
for line in in_file:
matches = pattern.findall(line)
if matches:
for match in matches:
err_occur.append(match)
except FileNotFoundError:
print("Input file %r not found." % input_filename)

for tagged in err_occur:
tweets.write(str(tagged)+"\n")


Как объяснялось выше, ожидаемый результат регулярного выражения для опубликованной строки JSON:

Myke Towers Ft. Mariah - Desaparecemos\n@myketowers #myketowers #mariah @mariah #Desaparecemos #music #musica\u2026 [link]


В мой текстовый файл в конечном итоге записывается следующее:

myketowers
Myke Towers Ft. Mariah - Desaparecemos\n@myketowers #myketowers #mariah @mariah #Desaparecemos #music #musica\u2026 [link]


Подробнее здесь: https://stackoverflow.com/questions/577 ... ex-results
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»