Как разбить на строку, сопоставить и вывести определенный шаблон? - PullRequest
2 голосов
/ 28 апреля 2019

Я пытаюсь решить проблему, которую я сделал с PHP, не знаю, как это сделать в Python.

В следующих трех строках нам нравится сравнивать на основе этих двух шаблонов:

  • только URL-адреса vine.co и twitter.com (другие домены следует игнорировать)

  • только URL перед запятыми , (последний URL в каждой строке должен игнорироваться)

Input

Row 1: https://vine.co/v/5W2Dg3XPX7a,https://vine.co/v/5W2Dg3XPX7a
Row 2: https://twitter.com/dog_rates/status/836677758902222849/photo/1,https://twitter.com/dog_rates/status/836677758902222849/photo/1
Row 3: https://www.gofundme.com/lolas-life-saving-surgery-funds,https://twitter.com/dog_rates/status/835264098648616962/photo/1,https://twitter.com/dog_rates/status/835264098648616962/photo/1

Выводом будет массив в Python (который основан на PHP):

array(3) {
  [0]=>
  string(30) "https://vine.co/v/5W2Dg3XPX7a
"
  [1]=>
  string(64) "https://twitter.com/dog_rates/status/836677758902222849/photo/1
"
  [2]=>
  string(63) "https://twitter.com/dog_rates/status/835264098648616962/photo/1"
}

PHP код:

$input = 'Row 1: https://vine.co/v/5W2Dg3XPX7a,https://vine.co/v/5W2Dg3XPX7a
Row 2: https://twitter.com/dog_rates/status/836677758902222849/photo/1,https://twitter.com/dog_rates/status/836677758902222849/photo/1
Row 3: https://www.gofundme.com/lolas-life-saving-surgery-funds,https://twitter.com/dog_rates/status/835264098648616962/photo/1,https://twitter.com/dog_rates/status/835264098648616962/photo/1';

$array = preg_split('/Row\s\d:\s/s', $input);

$output = array();
foreach ($array as $key => $value) {
    if (strlen($value) > 1) {
        $URL_arrays = explode(',', $value);
        foreach ($URL_arrays as $key => $value) {
            if ($key = sizeof($URL_arrays) - 1) {
                unset($URL_arrays[sizeof($URL_arrays) - 1]);
            } else {
                $match = preg_match('/twitter\.com|vine\.co/s', $value);
                if ($match) {
                    array_push($output, $value);
                }
            }
        }
    }
}

var_dump($output);

Этот вопрос основан на этой проблеме RegEx , на которую вы можете ответить любой из которых.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2019

Вы можете использовать это регулярное выражение для захвата всех URL, имеющих домен vine.com или twitter.com, которые имеют запятую сразу после URL,

https:\/\/(?:www\.)?(?:vine\.co|twitter\.com)[^,\s]*(?=,)

Как вы и хотели, ключевым моментом является этот позитивный взглядвпереди (?=,), что гарантирует, что ваш URL сопровождается запятой сразу после URL.

Regex Demo

Python-код, извлекающий URL-адреса с использованиемre.findall

import re

s = '''Row 1: https://vine.co/v/5W2Dg3XPX7a,https://vine.co/v/5W2Dg3XPX7a
Row 2: https://twitter.com/dog_rates/status/836677758902222849/photo/1,https://twitter.com/dog_rates/status/836677758902222849/photo/1
Row 3: https://www.gofundme.com/lolas-life-saving-surgery-funds,https://twitter.com/dog_rates/status/835264098648616962/photo/1,https://twitter.com/dog_rates/status/835264098648616962/photo/1'''

print(re.findall(r'https:\/\/(?:www\.)?(?:vine\.co|twitter\.com)[^,\s]*(?=,)', s))

Выходы,

['https://vine.co/v/5W2Dg3XPX7a', 'https://twitter.com/dog_rates/status/836677758902222849/photo/1', 'https://twitter.com/dog_rates/status/835264098648616962/photo/1']
1 голос
/ 28 апреля 2019

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

{url for x in s.split('\n') for url in x.split(': ')[1].split(',')  if 'vine.co' in url or 'twitter.co' in url}

Код :

s = '''Row 1: https://vine.co/v/5W2Dg3XPX7a,https://vine.co/v/5W2Dg3XPX7a
Row 2: https://twitter.com/dog_rates/status/836677758902222849/photo/1,https://twitter.com/dog_rates/status/836677758902222849/photo/1
Row 3: https://www.gofundme.com/lolas-life-saving-surgery-funds,https://twitter.com/dog_rates/status/835264098648616962/photo/1,https://twitter.com/dog_rates/status/835264098648616962/photo/1'''

print({url for x in s.split('\n') for url in x.split(': ')[1].split(',')  if 'vine.co' in url or 'twitter.co' in url})

# {'https://twitter.com/dog_rates/status/835264098648616962/photo/1', 
#  'https://twitter.com/dog_rates/status/836677758902222849/photo/1',
#  'https://vine.co/v/5W2Dg3XPX7a'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...