在python中用于regex,为以下字符串使用regex获得两个实例



我必须跟随字符串

line = '![[screenshotone.png]] and the next in the same line as ![[screenshottwo.jpg]]'

我想从一个正则表达式搜索中获取screenshotone.png和screenshottwo.jpg作为列表的两个元素。

output = re.findall('[[(.*)]]',line,re.I):

我想输出一个列表['screenshotone.png','screenshot two.jpg']但是它选择了['screenshotone.png]] and the next in the same line as ![[screenshottwo.jpg']

我无法理解我在正则表达式模式中做了什么改变,以便两个选择都按预期完成两次。

小心贪心,让正则表达式" lazy ";.*后插入?:

>>> re.findall(r'[[(.*?)]]',line,re.I)
['screenshotone.png', 'screenshottwo.jpg']

你的正则表达式匹配直到最后结束]]的所有内容的原因是*是贪婪的(来自"Watch Out for The greedy ")上图):

也就是说,加号[和您的*]使正则表达式引擎尽可能频繁地重复前面的令牌。只有当这导致整个正则表达式失败时,正则表达式引擎才会返回。也就是说,它将返回到加号[或星号],使其放弃最后一次迭代,并继续执行regex的其余部分。

这可能会解决

x = '![[screenshotone.png]] and the next in the same line as ![[screenshottwo.jpg]]'
pattern = "w+.w+"
re.findall(pattern, x)
output:
['screenshotone.png', 'screenshottwo.jpg']

w"→选择所有字母数字字符

"+"→贪婪地选择左侧的1个或多个表达式

。"→转义必须的点,(regex中的点表示匹配除新行字符以外的所有字符)

所以这是一个应该匹配文件名的模式。它可能需要根据数据中所有不同的文件名进行一些更改。

如果这解决了你所面临的问题,标记为已回答

最新更新