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