Нужен хороший regex, чтобы преобразовать URL в ссылки, но оставить существующие ссылки в покое

Вы можете использовать следующее понимание списка . Первый zip предназначен для выбора вторых списков в каждом подсписке, а второй - для чередования элементов из них, чтобы просто взять sum и mean:

from statistics import mean
sums, means = zip(*[(sum(i), mean(i)) for i in zip(*list(zip(*l))[1])])

print(sums)
# (21, 24, 27)
print(means)
# (7, 8, 9)

20
задан Blair Conrad 13 November 2008 в 14:58
поделиться

4 ответа

Jan Goyvaerts, создатель RegexBuddy, имеет записанный ответ к блогу Jeff Atwood, который решает проблемы, Jeff имел и предоставляет хорошее решение.

\b(?:(?:https?|ftp|file)://|www\.|ftp\.)[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$]

для игнорирования соответствий, которые происходят прямо рядом с "или>, Вы могли добавить (?<![">]) к запуску regex, таким образом, Вы добираетесь

(?<![">])\b(?:(?:https?|ftp|file)://|www\.|ftp\.)[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$]

, Это будет соответствовать полным адресам ( http://.. .) и адреса, которые запускаются с www. или ftp. - Вам не повезло с адресами как ars.userfriendly.org...

16
ответ дан 29 November 2019 в 23:57
поделиться

Бесстыдный разъем: можно посмотреть здесь ( замена регулярного выражения слово ссылкой ) для вдохновения.

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

Все, в чем Вы нуждаетесь, является regex, который соответствует URL (вместо слова). Самое простое предположение было бы похоже на это: URL (дополнительно) запускается с "http://", "ftp://" или "mailto:" и длится, пока нет никаких пробельных символов, разрывов строки, не отмечают скобки или кавычки).

Остерегаются, длинный regex вперед. Подайте заявку нечувствительно к регистру.

(href\s*=\s*['"]?)?((?:http://|ftp://|mailto:)?[^.,<>"'\s\r\n\t]+(?:\.(?![.<>"'\s\r\n])[^.,!<>"'\s\r\n\t]+)+)

быть предупрежденным - это будет также соответствовать URL, которые являются технически недопустимы, и это распознает things.formatted.like.this как URL. Это зависит от Ваших данных, если это слишком нечувствительно. Я могу подстроить regex, если у Вас есть примеры, куда он возвращает ложные положительные стороны.

regex произведет две группы соответствия. Группа 2 будет содержать подобранную вещь, которая наиболее вероятна URL. Группа 1 будет или содержать пустую строку или 'href="'. Можно использовать его в качестве индикатора, что это соответствие произошло внутренний href параметр существующей ссылки, и Вы не должны делать касания что один.

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

  1. Делают ссылку вокруг каждого URL существует (, если в группе 1 соответствия существует что-то!) Это будет производить дважды вложенный <a> теги для вещей, которые уже имеют ссылку.
  2. Сканирование для неправильно вложенного <a> теги, удаляя самый внутренний
0
ответ дан 29 November 2019 в 23:57
поделиться

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

/(?<!href=")http://\S*/

Очевидно, это не полное решение для поиска всех типов URL-адресов, но это должно решить вашу проблему, связанную с использованием существующих.

{ {1}}
0
ответ дан 29 November 2019 в 23:57
поделиться

Я немного изменил регулярное выражение, содержащееся в исходном ответе:

(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]

, который позволяет использовать больше поддоменов, а также выполняет более полную проверку тегов. Чтобы применить это к PHP preg replace, вы можете использовать:

$convertedText = preg_replace( '@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '<a href="\0" target="_blank">\0</a>', $originalText );

Обратите внимание, я удалил @ из регулярного выражения, чтобы использовать его в качестве разделителя для preg_replace. Довольно редко @ все равно будет использоваться в URL-адресе.

Очевидно, вы можете изменить заменяющий текст и удалить target = "_ blank" или добавить rel = "nofollow" и т. Д.

Надеюсь, это поможет.

10
ответ дан 29 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: