正则表达式:删除行情之间的空间,并在冒号之前停止(使用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...
然后我可以添加另一个正则表达式的步骤,把散#在前面
- 但是,这只是工作,如果该报价是第一,我不知道如何解决这个问题?
你可以用正则表达式来完成这一切,并提出警告。您遇到重复捕获组的问题,因为替换字符串中只有最后一次迭代可用。搜索((\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"
哇... 不错! 我转给你最好的答案 - 测试它,它效果很好,但报价是一个单引号:' 只是一件小事:) - 完美的作品。 我也很欣赏解释! – 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)
我正在使用** Yahoo Pipes **,所以,不幸的是,这不是一个选项。另外,我还没有学习Python - 但是,我认为Yahoo Pipes的功能类似? - 将是一个伟大的有一个“内部”管替代,有一天;所以,我会记下这个答案。 – 2014-08-28 00:32:52
我对雅虎管道一无所知,并且在手机上,所以我无法看到它。我认为这只是某种雅虎爬虫的API? – 2014-08-28 00:36:44
雅虎PIpes更多的是一个互联网应用程序。标语说:“像Unix管道一样,简单的命令可以结合在一起创建满足您需求的输出” 所以,从我的理解来看,它是一种UI/widget组合器,可以让您跳过很多编码。看代码不是一个选项。你可以放在一起的某些部分,正则表达式模块就是其中之一。 – 2014-08-29 02:06:18
谢谢:) 我会解决这个答案。 如果引用的标题后来出现在字符串中,它也会删除前面的单词之间的空格,但它以更简洁的方式处理标题的第一种情况。 – 2014-08-28 00:30:50
您使用什么语言?正则表达式并不擅长描述文本*转换*。 – 2014-08-27 19:46:39
我不编码一种语言;我正在使用** Yahoo Pipes **。我不善于编写代码来创建语言中的RSS过滤器。 我认为正则表达式是唯一的选择...或者可能是字符串工具和正则表达式的组合。 我其实从来没有读过关于字符串模块,直到现在:http://pipes.yahoo.com/pipes/docs?doc=string#StringReplace - 可能会尝试这些。 – 2014-08-27 21:21:25