我想从wiki字符串中删除所有文件,如下所示:
[[File:Edvac.jpg|thumb|[[EDVAC]], one of the first stored-program computers]]
但文件可以包含wiki链接,如何删除所有可以包含wiki链接的文件?我已经使用了这个正则表达式/\[\[File:[^\]]+\]\]/
但是这对包含wiki链接的文件不起作用,请注意我不想删除其他地方的wiki链接。
答案 0 :(得分:1)
如果Wiki链接中没有嵌套链接,则可以使用
\[\[File:[^[\]]*(?:\[\[[^[\]]*]][^[\]]*)*]]
请参阅regex demo
var re = /\[\[File:[^[\]]*(?:\[\[[^[\]]*]][^[\]]*)*]]/g;
var str = 'Some [[File:Edvac.jpg|thumb|[[EDVAC]], one of the first stored-program computers]] text [[File:Edvac.jpg|thumb|text here]]';
var result = str.replace(re, "");
document.body.innerHTML = result;
解释:
\[\[File:
- 文字序列[[File:
[^[\]]*
- 除[
和]
以外的零个或多个字符(?:\[\[[^[\]]*]][^[\]]*)*
- 零个或多个序列:
\[\[[^[\]]*]]
- 类型为[[text without [ and ] inside]]
[^[\]]*
- 除[
和]
以外的零个或多个字符]]
- 文字序列]]
答案 1 :(得分:1)
另一个简短的变体是:\[\[File:[^[\]\]]*(\[\[.*]])?[^[\]\]]*]]
。但最好包括检查文件:,图片,图片,媒体:和 media:因为它们也被用于Commons媒体嵌入的许多文章中:
str.replace(/\[\[(file|image|media):[^[\]\]]*(\[\[.*]])?[^[\]\]]*]]/gi, '')
答案 2 :(得分:0)
文件标题可以(并且,在维基百科上,有时也可以)包含嵌套括号,包括其他文件。您可以将平衡括号与recursive regexp匹配
|
\[\[File: # literal [[File:
(?P<balanced> # subpattern for []-balanced content
(?>[^\[\]]*) # zero or more non-bracket chars
# (with once-only subpattern for efficiency)
(?: # then a (possibly empty) sequence of...
\[(?&balanced)\] # []-balanced content in brackets
(?>[^\[\]]*) # followed by zero or more non-bracket chars
)*
)
\]\] # literal ]]
|x # extended mode flag (ignores whitespace)
(regex101)虽然你可能不想。 (另外,文件标题可能包含不平衡的括号。)
如果您对Python感到满意,那么您应该尝试使用mwparserfromhell,它具有强大的解析器,并且可以为您识别文件引用。
的内容import mwparserfromhell
def has_file_prefix(link):
return str(link.title).strip().startswith('File:')
text = 'I am a wiki page. I contain some images like [[File:Edvac.jpg|thumb|[[EDVAC]], one of the first stored-program computers [[File:Edvac2.jpg| [[nesting|nested]] file with random <nowiki>[[</nowiki> in caption ]] ]] [[ not a file ]] and lots of text.'
wikicode = mwparserfromhell.parse(text)
for file in wikicode.ifilter_wikilinks(matches=has_file_prefix):
try:
wikicode.remove(file)
except ValueError:
pass # probably tried to remove a nested file when the parent was already removed
print wikicode