此针对 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 写了这个,据我所知,它说:
- 查找(并丢弃)直到 string 的所有内容
{{Images from Auckland Museum|
,包括该字符串。(这是我能想到的最明显的分隔符)。 - 捕捉之后发生的一切。
- 查找(并丢弃)从一对右大括号 (
}}
) 的第一次出现到末尾的所有内容。
这只留下我感兴趣的部分:
section=library|object=photography|id=79483
到目前为止,一切都很好。
然后,我使用以下表达式创建了另一个 regex101.com 会话来处理该部分:
(?>.*?\=)(.*)(?>.*?\|)(?>.*?\=)(.*)(?>.*?\|)(?>.*?\=)(.*)
据我所知,这个表达式说:
- 查找(并丢弃)直到并包括第一个
=
. - 在此之后捕获所有内容,直到但不包括第一个
|
……并重复三次,每个捕获组一次,给我想要的三个数据点。
我的问题是:
- 如何组合这些正则表达式?简单地将第二个插入第一个代替它
(.*?)
似乎不起作用。 - 鉴于正则表达式允许递归,是否有更好(即更有效)的方式来编写第二个表达式?(SPARQL 端点/语言会允许这样做吗?)
- 在获得第一个捕获组之后,第一个表达式中是否有任何方法可以简单地说,例如“我得到了我想要的;停止”——这样做会提高效率吗?
提前致谢。