Ril*_*n42 4 regex pdf ruby-2.0
我正在尝试从PDF中提取引文。我确认我的正则表达式在这里适用于Rubular ,但是当我在真实的PDF上测试代码时,它会吐出一些奇怪的空格和错误的信息。如何修复此正则表达式,使其仅提取APA论文引文(参考文献部分中的引文,而不是文本引文)。APA 示例可能有用。我正在尝试从研究论文中获得参考。如果您需要更多详细信息,请告诉我。这个答案可以使用多个正则表达式,但是我确实需要能够提取作者,标题,日期和期刊。如果有帮助,我的尝试在下面:
require 'pdf-reader'
io = open('https://vhil.stanford.edu/pubs/2007/yee-proteus-effect.pdf')
out=open('dump.txt',"w")
reader = PDF::Reader.new(io)
reader.pages.each do |page|
/([a-zA-Z.,&\s]+?)(\(\d+\)).([\sa-zA-Z,:\n\t]+).([\sa-zA-Z,]+).([\sa-zA-Z,]+)/.match(page.text){|m|
puts "===CITATION===="
puts "author: "+m[0].to_str.gsub(/\n\r\t/,'')
puts "title: "+m[2].to_str.gsub(/\n\r\t/,'')
puts "date: "+m[1].to_str.gsub(/\n\r\t/,'')
puts "journal: "+m[3].to_str.gsub(/\n\r\t/,'')
}
#puts page.raw_content
end
puts"\n\n\n=======\n\n\n======"
puts reader.pages.last
Run Code Online (Sandbox Code Playgroud)
为了获得这些示例,我out.puts page.text在foreach循环中运行了。然后,我将大量文本复制到Rubular中,并使用我原来的正则表达式进行测试(上述)。
编辑
试试这个,我试图以这种方式修改它,以匹配您评论中的位置。
^(?<author>[A-Z](?:(?!$)[A-Za-z\s&.,'’])+)\((?<year>\d{4})\)\.?\s*(?<title>[^()]+?[?.!])\s*(?:(?:(?<jurnal>(?:(?!^[A-Z])[^.]+?)),\s*(?<issue>\d+)[^,.]*(?=,\s*\d+|.\s*Ret))|(?:In\s*(?<editors>[^()]+))\(Eds?\.\),\s*(?<book>[^().]+)|(?:[^():]+:[^().]+\.)|(?:Retrieved|Paper presented))
Run Code Online (Sandbox Code Playgroud)
最后一部分(?:Retrieved|Paper presented)可以用标题后面可能出现的其他单词扩展。
此正则表达式包含两个主要部分:
^(?<author>[A-Z](?:(?!$)[A-Za-z\s&.,'’])+)\((?<year>\d{4})\)\.?\s*(?<title>[^()]+?[?.!])\s*
与作者,日期和标题匹配的共享部分:
(?<author>[A-Z](?:(?!$)[A-Za-z\s&.,'’])+)- author分组,从行首开始匹配,仅当单词从大写字母开始时才使用,以避免匹配文本中的某处,在引用中点头,然后是字母,空格,标点符号等。您可以始终在[A-Za-z\s&.,'’]
字符类中添加一些符号,如果还有更多字符,则可能在本部分的参考中出现。\((?<year>\d{4})\)- year分组捕获数字,如果它们在方括号内,(?<title>[^()]+?[?.!])\s*-使用titlegroup捕获任意一个字符中的一个,但不捕获括号,然后捕获来自character class的字符[?.!],[^()]因为在测试过程中,我发现它阻止了regex多行无效匹配,这一点也很重要,该部分匹配受其他限制,没有它们会给出无效的结果,因此不会匹配独立的单独部分,(?:(?:(?<jurnal>(?:(?!^[A-Z])[^.]+?)),\s*(?<issue>\d+)[^,.]*(?=,\s*\d+|.\s*Ret))|(?:In\s*(?<editors>[^()]+))\(Eds?\.\),\s*(?<book>[^().]+)|(?:[^():]+:[^().]+\.)|(?:Retrieved|Paper
presented)) 匹配其余内容的替代方法。
(?<jurnal>(?:(?!^[A-Z])[^.]+?)),\s*(?<issue>\d+)[^,.]*(?=,\s*\d+|.\s*Ret))-此替代比赛司法标题无问题。jurnalgroup匹配以大写字母开头的片段,然后是not points(not .),懒惰的quantifire(匹配成功所需的匹配次数)和逗号。在[^.]被使用,因为一些jurnal标题由逗号,我不能用
[^,]这是我的第一个想法,所以我restreined这部分有一点,它总是在occour参考年末,不愿quantifire的匹配,它allaws放弃已经匹配的片段(最多)以进行后续匹配。该issue组将匹配具有某些内容的数字,直到下一个逗号或点为止,如果后面跟有带数字(页码)或点和单词的逗号,(?:In\s*(?<editors>[^()]+))\(Eds?\.\),\s*(?<book>[^().]+)-此部分匹配对已编辑书籍的引用,editor对所有内容进行匹配,但不匹配任何括号(最多由编者或编者关键词组成),其后跟随标题,并由下一个带有页码或点的括号限制(?:[^():]+:[^().]+\.)-该部分仅用于将参考文献与发布者和出版地的信息相匹配,以前使用?整体替代部分的方法无效,因为它在应与另一替代物相匹配的地方也相匹配,(?:Retrieved|Paper presented)) -此部分用于匹配引用在线资源或演示文稿等的参考。我可以使用其他关键字进行扩展,旧尝试
如果只需要作者,日期,标题和期刊号,可以尝试:
^(?<author>(?:(?!$)[A-Za-z\s&.,'’])+)\((?<year>\d{4})\)\.?\s*(?<title>[^?.!]+?[.?!])\s*(?!\s*Retrieved)(?:(?:(?<jurnal>(?:(?!^[A-Z])[^,])+?),\s*(?<issue>\d+)))
Run Code Online (Sandbox Code Playgroud)
但是,如果您也对编辑的书籍感兴趣,请尝试:
^(?<author>(?:(?!$)[A-Za-z\s&.,'’])+)\((?<year>\d{4})\)\.?\s*(?<title>[^?.!]+?[.?!])\s*(?:(?<retrieved>[Rr]etrieved.+)|(?:(?:(?<jurnal>(?:(?!^[A-Z])[^,])+?),\s*(?<issue>\d+)))|\s*In(?<editors>[^\(]+)\(Eds\.\),(?<book>[^.()]+))?
Run Code Online (Sandbox Code Playgroud)
这两个正则表达式都会将相关值捕获到命名组中:作者,年份,标题等。
| 归档时间: |
|
| 查看次数: |
1368 次 |
| 最近记录: |