Regex:删除引号之间的空格,并在冒号之前停止(使用雅虎管道)



我已经做了一段时间了,但这超出了我对regex的理解。

我在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...
    

然后我可以添加另一个regex步骤,将hash#放在前面

  • 但是,只有当引号在第一位时,它才有效,我不知道如何解决这个问题

您可以使用regex一步完成这一切,但需要注意。重复捕获组会遇到问题,因为替换字符串中只有最后一次迭代可用。搜索( (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"

您可以将文本与进行匹配

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

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

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

我不知道您使用的是什么语言,但这似乎是regex的一个糟糕选择。在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"作为一个单词,你需要对搜索结果进行第二次搜索。

相关内容

  • 没有找到相关文章

最新更新