问题描述
|
我在Rails中有一个字符串,例如“这是一条Twitter消息。#books《战争与和平》,列夫·托尔斯泰。我喜欢这本书!
这是使用正则表达式并将\“#books \”之间的文本提升为\ ..“的问题吗?
如果消息没有结构怎么办,例如:
\“这是一条推特讯息,#列奥·托尔斯泰的《战争与和平》一书,我很喜欢这本书!\”或
\“这是Twitter消息。我喜欢列夫·托尔斯泰#books写的《战争与和平》 \”
我如何能可靠地将短语“托尔斯泰的战争与和平”拉出来而又不知道事前的短语。
是否有任何宝石,方法等可以帮助我做到这一点?
至少,您会称呼我要做什么?这将帮助我在Google上搜索解决方案。我已经尝试过对\“解析\\”进行几次搜索,但是没有运气。
-编辑-
基于@rogeliog的建议,我将添加以下内容:
我可以忍受#books后面的垃圾文字,但之前没有。我尝试了“匹配。(/#books。* /)\”-结果在这里:www.rubular.com/r/gM7oSZxF5M。
但是如何捕获结果6? (例如,当某人将#books放在句子的末尾时)?
我可以用正则表达式进行if-then吗?就像是:
如果[#books在消息末尾],
然后[从#books的最后10个单词开始],
其他[匹配。(/#books。* /)]
如果您提供正则表达式,请使用rubular.com通过永久链接发布解决方案
解决方法
我认为您正在尝试解析一些非常复杂的变体。您是否拥有所有书名的数据库?这将有助于分配。
要从第一个示例中获得标题(\“这是一条Twitter消息。#books《战争与和平》,作者是Leo Tolstoy。我喜欢这本书!\”),您可以简单地执行以下操作:
\"This is a Twitter message. #books War & Peace by Leo Tolstoy. I love this book\".match(/#book.*\\./).to_s.gsub(\"#books\",\'\')
这将返回:“列夫·托尔斯泰的战争与和平。”
如果要根据#books是否在结尾处执行if else语句,则可以:
if text.match(/#books$/)
puts text.match(/([^\\s]*\\s){10}(#books$)/).to_s
else
puts text.match(/#books.*/).to_s.gsub(\"#books\",\'\')
end
如果#books位于末尾,则将为您提供书籍之前的最后10个单词;如果#books位于末尾,则将为您提供#books之后的任何内容
我真的没有更好的主意,希望对您有用,让我知道:)
, 我认为您需要的是自然语言处理。这是一个非常大的领域,具有许多技术和应用程序。特别是对于Ruby,您可能需要查看Ruby Linguistics项目。
祝您好运,解析和处理自然语言并非易事。