Как извлечь URL из огромного однострочного текстового файла? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть текстовый файл, из которого я хочу извлечь ссылки.

Проблема в том, что текстовый файл - это только одна строка с большим количеством ссылок!

Или это при открытиив блокноте он показывает это в виде множества файлов, но не организован.

Пример текста:

[{"участники": ["minanageh379", "xcsadc"], "разговор": [{" sender ":" minanageh379 "," creation_at ":" 2019-04-12T12: 51: 56.560361 + 00: 00 "," media ":" https://scontent -lax3-1.cdninstagram.ком / VP / edddf95178aca7bf75930ab8698ee45b / 5D45203B / t51.2885-15 / FR / E15 / s1080x1080 / 55823673_114448266206459_7321604432125975069_n.jpg? _nc_ht = scontent-lax3-1.cdninstagram.com & ig_cache_key = Mjg2ODYwNDMxNzU3OTI1MTE1NTAxNjQ1NTk5MDkwOTMzNzY% 3D.2"}, {" отправитель":" minanageh379 "," create_at ":" 2019-04-12T12: 51: 51.923138 + 00: 00 "," text ":" sd "}, {" sender ":" minanageh379 "," creation_at ":" 2019-04-12T12: 51: 41.689524 + 00: 00 "," text ":" sdsa "}, {" sender ":" xcsadc "," creation_at ":" 2019-04-12T12: 50: 57.283147 + 00: 00"," текст ":" ?‍❤️‍?‍"}, {" sender ":" xcsadc "," creation_at ":" 2019-04-12T12: 39: 35.248517 + 00: 00 "," text ":" czx "}, {" sender ":" xcsadc ","creat_at": «2019-04-12T12: 39: 34.352752 + 00: 00», «text»: «dsad»}, {«sender»: «xcsadc», «creation_at»: «2019-04-12T12: 39: 30.889023 + 00: 00 "," media ":" https://scontent -lax3-1.cdninstagram.com / vp / e985406d6eac06bb11c2d6052c1821a2 / 5D508106 / t51.2885-15 / e15 / s640x640 / 56218099560066060660776776scontent-lax3-1.cdninstagram.com & ig_cache_key = Mjg2ODYwMjk0MjA1ODQxNzYzNjM1OTI1ODMwMjYzMTExNjg% 3D.2"}, {" отправитель ": "xcsadc", "created_at": "2019-04-12T12: 38: 54,823472 + 00: 00","text": "hi hi hi"}]}]

ожидаемый результат

https://scontent -lax3-1.cdninstagram.com / vp /edddf95178aca7bf75930ab8698ee45b / 5D45203B / t51.2885-15 / пт / e15 / s1080x1080 / 55823673_114448266206459_7321604432125975069_n.jpg? _nc_ht = scontent-lax3-1.cdninstagram.com & ig_cache_key = Mjg2ODYwNDMxNzU3OTI1MTE1NTAxNjQ1NTk5MDkwOTMzNzY% 3D.2

1026 *
https://scontent -lax3-1.cdninstagram.com/vp/e985406d6eac06bb11c2d6052c1821a2/5D508106/t51.2885-15/e15/s640x640/56218099_577906226037731_8663356006073884002_n.jpg?_nc_ht=scontent-lax3-1.cdninstagram.com&ig_cache_key=Mjg2ODYwMjk0MjA1ODQxNzYzNjM1OTI1ODMwMjYzMTExNjg%3D.2

обновленный

{"sender": "ncccy", "created_at": "2019-01-28T17:09:29.216184+00:00", "media": "https://scontent-lax3-1.cdninstagram.com/vp/57c43d748xcasc1abf58c890c5a6df042/5D199AE8/t51.2885-15/e15/p480x480/49913269_2181952555454636_8892094125900591548_n.jpg?_nc_ht=scontent-lax3-1.cdninstagram.com&ig_cache_key=Mjg1NjgsdasdAwNjgxNTk1OTY0OTIwMTA1NTMzNDQ%3D.2"},

Ответы [ 5 ]

0 голосов
/ 18 апреля 2019

Еще одна альтернатива - анализ данных JSON.

Вы можете сделать это с помощью JavaScript.

Следующий фрагмент должен работать для анализа ваших данных.Он даже должен работать с несколькими URL-адресами в одном и том же сообщении text:

yourJSON
[0].conversation
.filter(x => x.media !== undefined || x.text !== undefined && /https?:/i.test(x.text))
.map(x => {
    const tmp = x.text + ' ' + x.media;
    const urls = tmp.match(/https?:[\w\-.~:\/?#\[\]@!$&'()*+,;=%]*/g);
    return x.sender + ":\n" + urls.join("\n");
})
.join("\n\n");

Вы можете вставить этот javascript (изменяя yourJSON с вашими данными) в какой-нибудь браузер, который имеет консоль javascript, например Firefox или Chrome,В Firefox вы можете запустить консоль с помощью (Control + Shift + K) и в Chrome с помощью (Control + Shift + I, затем нажмите «console»)

В качестве альтернативы вы можете использовать этот jsfiddle вместо.

Отредактируйте квадрат javascript, чтобы использовать ваши данные, а затем нажмите кнопку «Выполнить».

0 голосов
/ 17 апреля 2019

В то время как другие ответы делают именно то, что вам нужно, следует отметить, что указанная вами строка является допустимой строкой JSON.Вы можете проверить, что это действительно JSON здесь .

Если вы имеете дело с этой строкой в ​​программе, вы можете рассмотреть возможность использования анализатора JSON для вашего языка. Вот этот для Python

0 голосов
/ 17 апреля 2019

Попробуйте с этим:

Прежде всего, мы собираемся удалить все символы, которые не являются частью действительного URL, а также кавычки и пробелы. Это уберет смайлики, которые, кажется, вызывают проблемы с регулярными выражениями надстроек на блокноте ++ в некоторых случаях.

Наша первая замена будет:

Поиск: [^a-zA-Z0-9_\-.~:\/?#\[\]@!$&'()*+,;=%"\s]

Заменить на: (leave empty)

Заменить все

(Этот предыдущий шаг может не понадобиться в будущих версиях Notepad ++)

После очистки мы делаем следующую замену:

Поиск: (?i)(?:(?:(?!https?:).(?!https?:))*?"sender"\s*+:\s*+"([^"]*)"|\G)(?:.(?!"sender"\s*+:\s*+))*?(https?:.*?(?=[^a-zA-Z0-9_\-.~:\/?#\[\]@!$&'()*+,;=%]|https?:))|.*

Замена: (?{1}\n\n\1\t\2:(?{2}\t\2)

Заменить все

Это должно работать даже с атрибутами "text", которые имеют несколько URL внутри. URL будут разделены табуляторами.

Итак, после применения предыдущей процедуры к этим данным:

[{"participants": ["minanageh379", "xcsadc"], "conversation": [{"sender": "minanageh379", "created_at": "2019-04-12T12:51:56.560361+00:00", "media": "https://scontent-lax3-1.cdninstagram.com/vp/edddf95178aca7bf75930ab8698ee45b/5D45203B/t51.2885-15/fr/e15/s1080x1080/55823673_114448266206459_7321604432125975069_n.jpg?_nc_ht=scontent-lax3-1.cdninstagram.com&ig_cache_key=Mjg2ODYwNDMxNzU3OTI1MTE1NTAxNjQ1NTk5MDkwOTMzNzY%3D.2   http://foo.barhttps://bar.foo"}, {"sender": "minanageh379", "created_at": "2019-04-12T12:51:51.923138+00:00", "text": "sd"}, {"sender": "minanageh379", "created_at": "2019-04-12T12:51:41.689524+00:00", "text": "sdsa"}, {"sender": "xcsadc", "created_at": "2019-04-12T12:50:57.283147+00:00", "text": "?‍❤️‍?‍?"}, {"sender": "xcsadc", "created_at": "2019-04-12T12:39:35.248517+00:00", "text": "czx"}, {"sender": "xcsadc", "created_at": "2019-04-12T12:39:34.352752+00:00", "text": "dsad"}, {"sender": "xcsadc", "created_at": "2019-04-12T12:39:30.889023+00:00", "media": "https://scontent-lax3-1.cdninstagram.com/vp/e985406d6eac06bb11c2d6052c1821a2/5D508106/t51.2885-15/e15/s640x640/56218099_577906226037731_8663356006073884002_n.jpg?_nc_ht=scontent-lax3-1.cdninstagram.com&ig_cache_key=Mjg2ODYwMjk0MjA1ODQxNzYzNjM1OTI1ODMwMjYzMTExNjg%3D.2"}, {"sender": "xcsadc", "created_at": "2019-04-12T12:38:54.823472+00:00", "text": "hi hi hi"}, {"sender": "no_media_no_text", "created_at": "2019-04-12T12:38:54.823472+00:00"}, {"sender": "url_inside_text", "created_at": "2019-04-12T12:38:54.823472+00:00", "text": "Hi! {check} this url: \"http://foo.bar\" another url: https://new.url.com/ yet another one: https://google.com/"}, {"sender": "ncccy", "created_at": "2019-01-28T17:09:29.216184+00:00", "media": "https://scontent-lax3-1.cdninstagram.com/vp/57c43d748xcasc1abf58c890c5a6df042/5D199AE8/t51.2885-15/e15/p480x480/49913269_2181952555454636_8892094125900591548_n.jpg?_nc_ht=scontent-lax3-1.cdninstagram.com&ig_cache_key=Mjg1NjgsdasdAwNjgxNTk1OTY0OTIwMTA1NTMzNDQ%3D.2"}, {"sender": "ny", "created_at": "2017-10-22T20:49:50.042588+00:00", "media": "https://scontent-lax3-1.cdninstagram.com/vp/19d94ea45c2102a0f7c97838ef546b93/5D14B3C3/t51.2885-15/e15/22708873_149637425772501_5029503881546039296_n.jpg?_nc_ht=scontent-lax3-1.cdninstagram.com&ig_cache_key=Mjc4MzA3MDIyMTI3NDE3Njc3NTQxNTM1NTI2MjQyMjIyMDg%3D.2"}, {"sender": "xcsadc", "created_at": "2019-04-12T12:39:35.248517+00:00", "text": "czx"}]}]

Получаем:

minanageh379    https://scontent-lax3-1.cdninstagram.com/vp/edddf95178aca7bf75930ab8698ee45b/5D45203B/t51.2885-15/fr/e15/s1080x1080/55823673_114448266206459_7321604432125975069_n.jpg?_nc_ht=scontent-lax3-1.cdninstagram.com&ig_cache_key=Mjg2ODYwNDMxNzU3OTI1MTE1NTAxNjQ1NTk5MDkwOTMzNzY%3D.2    http://foo.bar  https://bar.foo

xcsadc  https://scontent-lax3-1.cdninstagram.com/vp/e985406d6eac06bb11c2d6052c1821a2/5D508106/t51.2885-15/e15/s640x640/56218099_577906226037731_8663356006073884002_n.jpg?_nc_ht=scontent-lax3-1.cdninstagram.com&ig_cache_key=Mjg2ODYwMjk0MjA1ODQxNzYzNjM1OTI1ODMwMjYzMTExNjg%3D.2

url_inside_text http://foo.bar  https://new.url.com/    https://google.com/

ncccy   https://scontent-lax3-1.cdninstagram.com/vp/57c43d748xcasc1abf58c890c5a6df042/5D199AE8/t51.2885-15/e15/p480x480/49913269_2181952555454636_8892094125900591548_n.jpg?_nc_ht=scontent-lax3-1.cdninstagram.com&ig_cache_key=Mjg1NjgsdasdAwNjgxNTk1OTY0OTIwMTA1NTMzNDQ%3D.2

ny  https://scontent-lax3-1.cdninstagram.com/vp/19d94ea45c2102a0f7c97838ef546b93/5D14B3C3/t51.2885-15/e15/22708873_149637425772501_5029503881546039296_n.jpg?_nc_ht=scontent-lax3-1.cdninstagram.com&ig_cache_key=Mjc4MzA3MDIyMTI3NDE3Njc3NTQxNTM1NTI2MjQyMjIyMDg%3D.2

Может случиться, что вы получите дублированные URL-адреса, если они дублируются на исходном вводе (с одинаковыми или разными атрибутами).

После обработки вы можете удалить дубликаты с помощью этого регулярного выражения:

Поиск: (?i)\t(https?:\S++)(?=[^\n]+\1)

Заменить на: (nothing)

Заменить все

0 голосов
/ 17 апреля 2019

Чтобы извлечь только ссылки из текстового файла, выполните регулярное выражение Replace All, используя следующую команду:

Найти что:

.*?(https?:[^"]+)(?(?!.*?https?:).*)

Заменить на:

$1\n\n

Демо 1 1

Обратите внимание, что вам нужно проверить Wrap around, если точка вставки находится не в начале текста.

Пояснение:

.*?(https?:[^"]+)(?(?!.*?https?:).*)
|_||____________||_________________|
 |    ____|               |
 |   |    ________________|
 |   |   |
 |   |  [3] If there are no more following links, grab and discard the rest of the text
 |  [2] Store the link in $1 (starting with http and ending just before the first following")
[1] Grab and discard everything up 'til the first link (i.e. starting with http: or https:)

При использовании «Заменить все» поиск и замена автоматически продолжаются до тех пор, пока регулярное выражение не будет соответствовать, начиная с последней точки, в которой данные были сопоставлены, до того момента, который в этом случае был бы непосредственно перед двойной кавычкой в ​​конце текущая ссылка, если есть еще ссылки, или конец текста в противном случае.



Чтобы также извлечь отправителя, используйте следующее:

Найти что:

.*?\{(?:([^"]*)"){4}[^{}]*?(https?:[^"]+)(?(?!.*?https?:).*)

Заменить на:

$1 $2\n\n

Демо 2 2

Пояснение:

Прибытие завтра


Альтернативное регулярное выражение, чтобы сделать то же самое, но, вероятно, немного яснее:

.*?"sender": "([^"]*)[^}]*?(https?:[^"]+)(?(?!.*?https?:).*)

Демо 3 3

Пояснение:

.*?"sender": "([^"]*)[^}]*?(https?:[^"]+)(?(?!.*?https?:).*)
|_||_________||_____||____||____________||_________________|
 |   ___|  ______|  ___|  _______|  _____________|
 |  |   __|  ______|  ___|  _______|
 |  |  |   _|   _____|  ___|
 |  |  |  |   _|  _____|
 |  |  |  |  |   |
 |  |  |  |  |  [6] If there are no more following links, grab and discard the rest of the text
 |  |  |  | [5] Store the link in $2 (starting with http and ending just before the first following")
 |  |  | [4] Grab and discard everything within the current set of braces up 'til the link
 |  | [3] Store the sender name in $1 
 | [2] Grab and discard "sender": " (i.e. up to the opening quote of the sender name)
[1] Grab and discard everything up 'til the first "sender" key which has an associated link

Шаг [1] работает, первоначально начиная с начала текста и захватывая все до первого ключа отправителя, затем захватывая ключ через [2], захватывая имя отправителя в [3], и захватывая все до связанная ссылка, если она существует в [4]. Если нет связанной ссылки, происходит сбой [5], и регулярное выражение возвращается к шагу [1], который продолжает захватывать все после первого ключа отправителя до второго ключа отправителя. Этот цикл повторяется до тех пор, пока не будет найден ключ отправителя, с которым связана ссылка.

На этом этапе шаг [5] завершается успешно, а затем шаг [6] либо захватывает остальную часть текста, либо ничего.

Наконец, весь захваченный текст заменяется на $1 $2\n\n, то есть имя отправителя, затем пробел, ссылка, а затем два символа новой строки.

На этом завершается первая «замена». Поскольку был выбран параметр «Заменить все», весь процесс начинается снова, но с указателем текста либо в двойных кавычках в конце ранее найденной ссылки, либо в конце текста, а не в начале.

0 голосов
/ 12 апреля 2019
  • Ctrl + H
  • Найти что: (?:^|\G).*?"media": "(https://[^"]+)(?:(?!https:).)*
  • Заменить на: $1\n
  • check Обтекание
  • check Регулярное выражение
  • UNCHECK . matches newline
  • Заменить все

Объяснение:

(?:^|\G)            # beginning of line OR restart from last match position
.*?                 # 0 or more any character but newline, not greedy
"media": "          # literally
(                   # start group 1
  https://[^"]+     # https:// fllowed by 1 or more not double quote, the url
)                   # end group 1
(?:(?!https:).)*    # Tempered greedy token, make sure we haven't "https" after

Замена:

$1         # content of group 1, the URL

Результат для данного примера:

https://scontent-lax3-1.cdninstagram.com/vp/edddf95178aca7bf75930ab8698ee45b/5D45203B/t51.2885-15/fr/e15/s1080x1080/55823673_114448266206459_7321604432125975069_n.jpg?_nc_ht=scontent-lax3-1.cdninstagram.com&ig_cache_key=Mjg2ODYwNDMxNzU3OTI1MTE1NTAxNjQ1NTk5MDkwOTMzNzY%3D.2
https://scontent-lax3-1.cdninstagram.com/vp/e985406d6eac06bb11c2d6052c1821a2/5D508106/t51.2885-15/e15/s640x640/56218099_577906226037731_8663356006073884002_n.jpg?_nc_ht=scontent-lax3-1.cdninstagram.com&ig_cache_key=Mjg2ODYwMjk0MjA1ODQxNzYzNjM1OTI1ODMwMjYzMTExNjg%3D.2

Снимок экрана:

enter image description here

...