Regex: удаление пробела между кавычками и остановка перед двоеточием (с помощью Yahoo Pipes)

Я работал над этим некоторое время, но это за пределами моего понимания регулярных выражений.

Я использую Yahoo Pipes в RSS и хочу создавать хэштеги из заголовков; Итак, я хотел бы удалить пробел из всего, что находится между кавычками, но, если в кавычках есть двоеточие, я хочу только удалить пробел между словами перед двоеточием.

И было бы замечательно, если бы я мог также захватить неразмеченные слова как группу, чтобы иметь возможность использовать: #$1 для вывода хэштега за один шаг.

Итак, что-то вроде:

"The New Apple: Worlds Within Worlds" Before We Begin...

Может быть заменен как #$1 - с таким результатом:

"#TheNewApple: Worlds Within Worlds" Before We Begin...

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

\s(?=\s)?|(‘|’|(Review)|:.*)

("Обзор" - это слово, которое часто употреблялось перед двоеточиями и не могло быть удалено, если бы оно было позже в названии; это то, для чего это нужно, но я бы не хотел, чтобы это было более универсальным)

Но у него есть две проблемы:

  • Я должен использовать несколько шагов. Результатом этого регулярного выражения будет:

    "TheNewApple: Worlds Within Worlds" Before We Begin...
    

И я мог бы затем добавить еще один шаг регулярного выражения, чтобы поставить хэш # перед

  • Но это работает, только если кавычки первые, и я не знаю, как это исправить...

4 ответа

Решение

Вы можете сделать все это за один шаг с регулярным выражением, с оговоркой. Вы столкнетесь с проблемами с повторяющейся группой захвата, потому что в строке замены доступна только последняя итерация. В поисках ( (\w+))+ и заменить на $2 заменит все слова только последним совпадением, а не тем, что мы хотим.

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

Поиск: "(\w+)(?: (\w+))?(?: (\w+))?(?: (\w+))?(?: (\w+))?(?: (\w+))?

Заменить: "#$1$2$3$4$5$6

Это заменит названия из 6 слов в точности так, как вам нужно. Первый, "(\w+) соответствует любому слову после кавычки. В строке замены она возвращается как "#$1, добавив хэштег. Остальное представляет собой повторный список (?: (\w+))? совпадения, каждое совпадение возможного пробела и слова. Обратите внимание, что пространство является частью группы без захвата; только слово является частью внутренней группы захвата. В строке замены у меня есть $1$2$3$4$5$6, который возвращает слова без пробелов. Обратите внимание, что двоеточие не будет соответствовать ни одной части этого, поэтому оно остановится, как только попадет в двоеточие.

Примеры:

"The New Apple: Worlds Within Worlds" Before We Begin...
"The New Apple" Before We Begin...
"One: Two"
only "One" word
this has "Two Words"
"The Great Big Apple Dumpling"
"The Great Big Apple Dumpling Again: Part 2"

Результаты:

"#TheNewApple: Worlds Within Worlds" Before We Begin...
"#TheNewApple" Before We Begin...
"#One: Two"
only "#One" word
this has "#TwoWords"
"#TheGreatBigAppleDumpling"
"#TheGreatBigAppleDumplingAgain: Part 2"

Я понятия не имею, какой язык вы используете, но это кажется плохим выбором для регулярных выражений. В Python я бы сделал это:

# Python 3
import re

titles = ['''"The New Apple: Worlds Within Worlds" Before We Begin...''',
           '''"Made Up Title: For Example Only" So We Can Continue...''']

hashtagged_titles = list()
for title in titles:
    hashtagme, *restofstring = title.split(":")
    hashtag = '"#'+hashtagme[1:].translate(str.maketrans('', '', " "))
    result = "{}:{}".format(hashtag, restofstring)
    hashtagged_titles.append(result)

Сделайте глобальный поиск

\ (?=.*:)

Заменено ни на что. пример

Вам понадобится второй поиск по результатам этого, если вы хотите захватить "TheNewApple" как одно слово.

Вы можете сопоставить текст с

"([^:]*)(.*?)"(.*)

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

'"#' + removeSpace($1) + $2 + '"' + $3
Другие вопросы по тегам