REGEX:如何在文本文件中删除除每一个第四个单词以外的所有单词



我正在与愚蠢的马尔可夫链Twitter bot进行相当混乱的实验。该机器人的当前版本打开了我的推文存档的CSV文件,剥离了链接以及Whath and whats and and ofly and ofly纯文本。奇迹般有效。喜欢它!

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%的内容。是否有一个正则可以处理?

我对正则解决方案不了解,但是您可以这样做:

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

我可能会使用每个_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

接受的答案很好,但是由于您询问了正则表达式,我想我会告诉您如何完成。这是一个从:

开始
/((S+s+){3})S+s*/

我选择以"单词"为代表任何非Whitespace字符的序列。这与任何单词(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.

最新更新