正则表达式:删除行情之间的空间,并在冒号之前停止(使用Yahoo管道)

问题描述:

我一直在研究这一段时间,但它超出了我对正则表达式的理解。正则表达式:删除行情之间的空间,并在冒号之前停止(使用Yahoo管道)

我在RSS上使用雅虎管道,我想从标题创建标签;所以,我想从引号之间的所有内容中删除空格,但是,如果引号内有冒号,我只希望在冒号之前的单词之间移除空格。

而且,如果我还可以将未打开的单词作为一个组捕获,可以使用#$ 1来一步输出哈希标签。

所以,像这样:

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

可以取代像1#$ - 这个结果:

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

工作后,我能想出,这正则表达式:

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

(“Review”是一个词,经常出现在冒号前,不会被剥离,我它后来在标题中;这就是这对,但我想没有要求,更普遍的)

但是,它有两个问题:

  • 我不得不使用多个步骤。该正则表达式的结果将是:

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

然后我可以添加另一个正则表达式的步骤,把散#在前面

  • 但是,这只是工作,如果该报价是第一,我不知道如何解决这个问题?
+0

您使用什么语言?正则表达式并不擅长描述文本*转换*。 – 2014-08-27 19:46:39

+0

我不编码一种语言;我正在使用** Yahoo Pipes **。我不善于编写代码来创建语言中的RSS过滤器。 我认为正则表达式是唯一的选择...或者可能是字符串工具和正则表达式的组合。 我其实从来没有读过关于字符串模块,直到现在:http://pipes.yahoo.com/pipes/docs?doc=string#StringReplace - 可能会尝试这些。 – 2014-08-27 21:21:25

你可以用正则表达式来完成这一切,并提出警告。您遇到重复捕获组的问题,因为替换字符串中只有最后一次迭代可用。搜索((\w+))+并替换为$2将替换全部只是最后一场比赛的话 - 不是我们想要的。

解决方法是重复该模式任意次数,以满足您的使用需求。每个独立的组都可以被引用。

搜索:"(\w+)(?: (\w+))?(?: (\w+))?(?: (\w+))?(?: (\w+))?(?: (\w+))?

替换:"#$1$2$3$4$5$6

这将取代多达6个字的标题,正是因为你需要他们。首先,匹配"(\w+)符合报价中的单词。在替换字符串中,它将作为"#$1加上hashtag。其余的是(?: (\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" 
+0

哇... 不错! 我转给你最好的答案 - 测试它,它效果很好,但报价是一个单引号:' 只是一件小事:) - 完美的作品。 我也很欣赏解释! – 2014-08-29 07:30:07

您可以

"([^:]*)(.*?)"(.*) 
文本匹配

然后使用一些编程语言的输出结果是这样的:

'"#' + removeSpace($1) + $2 + '"' + $3 

我不知道你所使用的语言,但是这似乎是正则表达式一个糟糕的选择。在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) 
+0

我正在使用** Yahoo Pipes **,所以,不幸的是,这不是一个选项。另外,我还没有学习Python - 但是,我认为Yahoo Pipes的功能类似? - 将是一个伟大的有一个“内部”管替代,有一天;所以,我会记下这个答案。 – 2014-08-28 00:32:52

+0

我对雅虎管道一无所知,并且在手机上,所以我无法看到它。我认为这只是某种雅虎爬虫的API? – 2014-08-28 00:36:44

+0

雅虎PIpes更多的是一个互联网应用程序。标语说:“像Unix管道一样,简单的命令可以结合在一起创建满足您需求的输出” 所以,从我的理解来看,它是一种UI/widget组合器,可以让您跳过很多编码。看代码不是一个选项。你可以放在一起的某些部分,正则表达式模块就是其中之一。 – 2014-08-29 02:06:18

进行全局搜索

\ (?=.*:) 

什么也没有更换。 Example

如果要将“TheNewApple”捕获为单个单词,则需要对结果进行第二次搜索。

+0

谢谢:) 我会解决这个答案。 如果引用的标题后来出现在字符串中,它也会删除前面的单词之间的空格,但它以更简洁的方式处理标题的第一种情况。 – 2014-08-28 00:30:50