在python中,对于regex,使用regex为以下字符串[duplicate]获取两个示例

zfciruhq  于 2023-04-13  发布在  Python
关注(0)|答案(2)|浏览(125)

此问题已在此处有答案

Regular expression to stop at first match(9个回答)
9天前关闭
我得跟着绳子走

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']
我不明白我在正则表达式模式中做了什么改变,以便两个选择都按预期完成两次。

polkgigr

polkgigr1#

Watch Out for The Greediness,并通过在.*后面插入?使正则表达式“惰性”:

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

你的正则表达式匹配所有东西直到最后一个]]结束的原因是* is greedy(来自上面的“当心贪婪”):
也就是说,加号[和*在您的例子中]会使正则表达式引擎尽可能频繁地重复前面的令牌,只有当这导致整个正则表达式失败时,正则表达式引擎才会回溯,也就是说,它会回到加号[或星号],使其给予最后一次迭代,并继续执行正则表达式的剩余部分。

zvokhttg

zvokhttg2#

也许这能解决

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' -〉选择所有字母数字字符
'+' -〉贪婪地选择左边的一个或多个表达式
'.' -〉转义必须使用的点(regex中的点表示匹配除和直到新行char之外的所有字符)
所以这是一个应该匹配文件名的模式。它可能需要根据数据中所有不同的文件名进行一些更改。
如果这解决了您所面临的问题,则标记为已回答

相关问题