0

此针对 Wikidata SPARQL 端点的查询返回 Wikimedia Commons 类别“奥克兰博物馆 1930 年代照片”中前 50 个文件的 Wikitext 内容。对于每个文件,我想从该内容中提取几条数据。

仅使用一个文件File:("Ultimate" stall) (AM 79483-1).jpg,例如,内容如下所示:

== {{int:filedesc}} ==
{{Artwork 
| description = {{en|1=At the equestrian show. A man stands in front of a stall selling radios.}} 
| title = ("Ultimate" stall) 
| artist = {{Creator:Tudor Washington Collins}} 
| date = 1938 
| place of creation = 
| source = {{Images from Auckland Museum|section=library|object=photography|id=79483}}
           [https://api.aucklandmuseum.com/id/media/p/806abf5c0952f972e56bc95fed841c5031bcb9ff Photo] 
| accession number = 79483 (object number) 
| object type = 
| technique = Silver gelatin dry plate 
| dimensions = 
| institution = {{Institution:Auckland War Memorial Museum}} 
| permission = This image has been released as "CCBY" by Auckland Museum. For details refer to the
               [[Commons:Batch_uploading/AucklandMuseumCCBY|Commons project page]]. 
| credit line = 
| notes = 
| other_versions = <gallery> ("Ultimate" stall) (AM 79483-2).jpg </gallery>
}}

== {{int:license-header}} ==
{{CC-BY-4.0|1=Auckland Museum}}
[[Category:Images uploaded by Fæ]] [[Category:1930s photographs in Auckland Museum]]
[[Category:Tudor Washington Collins]] [[Category:Radio in Auckland Museum]]
[[Category:Images from Auckland Museum]]

我对source参数中的这 3 个值感兴趣。我试图用正则表达式解析这个内容;这是我写的第一个表达式,它涉及大部分 Wikitext:

^(?>.+{{Images from Auckland Museum\|)(.*?)(?>}}.+)$

用 regex101.com 写了这个,据我所知,它说:

  1. 查找(并丢弃)直到 string 的所有内容{{Images from Auckland Museum|,包括该字符串。(这是我能想到的最明显的分隔符)。
  2. 捕捉之后发生的一切。
  3. 查找(并丢弃)从一对右大括号 ( }}) 的第一次出现到末尾的所有内容。

这只留下我感兴趣的部分:

section=library|object=photography|id=79483

到目前为止,一切都很好。

然后,我使用以下表达式创建了另一个 regex101.com 会话来处理该部分

(?>.*?\=)(.*)(?>.*?\|)(?>.*?\=)(.*)(?>.*?\|)(?>.*?\=)(.*)

据我所知,这个表达式说:

  1. 查找(并丢弃)直到并包括第一个=.
  2. 在此之后捕获所有内容,直到但不包括第一个| ……并重复三次,每个捕获组一次,给我想要的三个数据点。

它似乎工作: Regex101.com 评估语法

我的问题是:

  1. 如何组合这些正则表达式?简单地将第二个插入第一个代替它(.*?)似乎不起作用。
  2. 鉴于正则表达式允许递归,是否有更好(即更有效)的方式来编写第二个表达式?(SPARQL 端点/语言会允许这样做吗?)
  3. 在获得第一个捕获组之后,第一个表达式中是否有任何方法可以简单地说,例如“我得到了我想要的;停止”——这样做会提高效率吗?

提前致谢。

4

0 回答 0