正则表达式:如何删除文本文件中除第四个单词以外的所有单词?

时间:2016-12-07 16:47:10

标签: ruby regex

我正在用愚蠢的Markov Chain twitter机器人做一个相当混乱的实验。机器人的当前版本打开我的推文存档的CSV文件,删除链接和诸如此类的东西,并仅留下纯文本。奇迹般有效。喜欢它!

PATH_TO_TWEETS_CSV   = 'tweets.csv'
PATH_TO_TWEETS_CLEAN = 'liber_markov.txt'

csv_text = CSV.parse(File.read(PATH_TO_TWEETS_CSV))

File.open(PATH_TO_TWEETS_CLEAN, 'w') do |file|
  csv_text.reverse.each do |row|
    tweet_text = row[5].gsub(/(?:f|ht)tps?:\/[^\s]+/, '').gsub(/\n/,' ')
    file.write("#{tweet_text}\n")
  end
end

然而

我想向前迈出疯狂的一步,再次筛选文件,删除除了每四个字以外的所有内容,有效删除75%的内容。是否有可以处理的正则表达式?

3 个答案:

答案 0 :(得分:1)

我没有具体了解正则表达式解决方案,但你可以这样做:

File.open(PATH_TO_TWEETS_CLEAN, 'w') do |file|
  csv_text.reverse.each do |row|
    clean_text = row[5].gsub(/(?:f|ht)tps?:\/[^\s]+/, '').gsub(/\n/,' ')
    tweet_text = clean_text.split.select.with_index { |_, i| i % 4 == 0 }.join(' ')
    file.write("#{tweet_text}\n")
  end
end

答案 1 :(得分:0)

我可能会使用each_slice

File.open(PATH_TO_TWEETS_CLEAN, 'w') do |file|
  csv_text.reverse.each do |row|
    tweet_text = row[5].gsub(/(?:f|ht)tps?:\/[^\s]+/, '').gsub(/\n/,' ')
    tweet_text = tweet_text.split.each_slice(4).map(&:first).join(' ')
    file.write("#{tweet_text}\n")
  end
end

答案 2 :(得分:0)

接受的答案很好,但既然你问过正则表达式,我想我会告诉你如何做到这一点。这是一个正面的Regexp:

/((\S+\s+){3})\S+\s*/

我选择了"字"表示任何非空白字符序列。这匹配任何单词(\S+)后跟一个或多个空格字符(\s+),三次,后跟任何单词和零个或多个空格字符(零,以便它可以匹配最后一个单词串)。以下是您将如何使用它:

tweet_text = "I'm doing a rather chaotic experiment with a goofy Markov Chain twitter bot."
tweet_text.gsub(/((\S+\s+){3})\S+\s*/, '\1')
# => I'm doing a chaotic experiment with goofy Markov Chain bot.