如何从字符串中删除特定单词 - Ruby

Posted

技术标签:

【中文标题】如何从字符串中删除特定单词 - Ruby【英文标题】:How can I remove specific words from a string - Ruby 【发布时间】:2021-12-13 23:06:01 【问题描述】:

我有以下字符串,我想从中提取任何不包含数字或特殊字符的“单词”。目前,可接受逗号、问号或句号:

b? Dl )B 4(V! A. MK, YtG ](f 1m )CNxuNUR PG?

期望的输出:

b? Dl A. MK, YtG

5

当前输出:

b? Dl A. MK, YtG 1m

6

目前,下面的函数成功地从字符串中删除了数字,但是,同时包含数字和字母的单词不会被省略。因此,“1m”包含在我当前的输出中。

当前功能:

def howMany(sentence)

    if sentence.is_a? String
        
        output = sentence.split
        count = 0

        test_output = []

        output.each |word| 

            if word !~ /\D/ || word =~ /[!@#$%^&*()_+\[\]:;'"\/\\><]/
                count
            else
                test_output.push(word)
                count += 1
            end

           

        puts test_output 
        puts count 
    
    else
        puts "Please enter a valid string" 
    end

end 

我的假设是我必须以某种方式遍历字符串中的每个单词以查找它是否包含数字,但是,我不确定如何执行该特定解决方案。我曾想过在我的output.each 函数中使用.split(""),但尝试了几次都没有成功。

任何建议将不胜感激。

提前致谢!

【问题讨论】:

您刚刚删除了一个带有答案的问题。尽管系统允许您这样做,但如果这是一个合理的答案,那么您会因为浪费回答者的努力而皱眉。 (但仅代码的答案被认为很糟糕。)即使被删除,非正分数的帖子也计入询问限制。研究网站的运作方式。 Help centerMeta Stack OverflowMeta Stack Exchange 对于代码问题,请提供minimal reproducible example。在考虑发布之前研究问题,包括使用“site:***.com”进行谷歌搜索。 How to Ask希望你不介意我在这里发帖。 (无法对已删除的帖子发表评论。) 【参考方案1】:

这是String#scan 使用正则表达式的作业。

str = "b? Dl )B 4(V! A. MK, YtG ](f 1m )CNxuNUR PG?"
str.scan(/(?<!\S)[a-z.,\?\r\n]+(?!\S)/i)
  #=> ["b?", "Dl", "A.", "MK,", "YtG"]

Ruby demo ¯\(ツ)>PCRE demo

我已经包含了 regex101.com 的链接,这是一个用于测试正则表达式的流行站点,因为它提供了广泛的信息,特别是通过将鼠标悬停在表达式的每个元素上可以获得对其功能的解释。 (就是通过悬停光标。)由于该站点不支持 Ruby 的正则表达式引擎(Onigmo for v2.0+),我选择了 PCRE 正则表达式引擎,在这种情况下它给出了结果与 Ruby 的引擎相同。


正则表达式可以写成free-spacing模式以使其自文档化。

/
(?<!\S)         # negative lookbehind asserts that the following match is
                # not preceded by a character other than a whitespace
[a-z.,\?\r\n]+  # match one or more of the indicated characters
(?!\S)          # negative lookahead asserts that the previous match is
                # not followed by a character other than a whitespace
/ix             # case-insensitive and free-spacing regex definition modes

或者,为了避免需要负向后看和负前瞻,可以在空格上拆分然后选择:

a.select  |s| s.match?(/\A[a-z.,\?\r\n]+\z/i) 
  #=> ["b?", "Dl", "A.", "MK,", "YtG"]

【讨论】:

非常感谢您的帮助,Cary!在阅读本文之前,我已经找到了一个解决方案,但肯定会进一步研究您的答案以及您提供的有关正则表达式的资源。再次感谢!【参考方案2】:

我建议尝试这样的事情。

使用 split sentence.split(' ')句子转换为数组。 然后只允许使用 filter 匹配模式的那些 然后将过滤后的列表用于两个 puts 操作。它应该看起来像这样。

def how_many(sentence)
  sentence.split(' ').filter  |word| matches_pattern?(word) .tap do |words|
    puts words.size
    puts words # or words.join(' ')
  end
end

def matches_pattern?(word)
  word.matches? /some_regular_expression/
end

您当然可以相应地修改以添加任何侧面案例等。 这将是一个更惯用的解决方案。

请注意,您也可以使用.filter(&amp;method(:matches_pattern?)),但这可能会让某些人感到困惑。

编辑:rubular.com 是尝试正则表达式的好地方。

编辑:当事情变得困难时,试着把它们分成更小的块(即尽量不要让方法超过 5 行)。

【讨论】:

感谢您的帮助。我最终去了 rubular.com,结果我所要做的就是将 word !~ /\D/ 更改为 word !~ /\d/ LOL。我认为它们是相同的,但 D 表示任何非数字,而 d 表示任何数字。不过,我肯定会玩弄你答案中包含的一些东西。再次感谢!

以上是关于如何从字符串中删除特定单词 - Ruby的主要内容,如果未能解决你的问题,请参考以下文章

从数组中删除仅大小写不同的字符串值(Ruby)

从文本字符串中删除特定单词? [复制]

从字符串中删除特定单词

如何从文本语料库中删除特定的单字组,但仍保留该单词的双字组?

如何通过C#中的特定片段从句子中提取整个单词?

Bash脚本从.txt文件中删除特定行[重复]