perl 和 python 正则表达式/匹配和捕获最小长度的差异

Differences in perl and python regex / matching and caputuring minimum length

我希望这个 python 脚本:

import re

path='assign-e398846de42d98b1f79109926d0da510.json'

print(path)

m = re.compile('[a-z0-9]{8,}')
print(m.match(path))

print(re.match('[\w\d]{8,}', path))

与此 perl 行为类似(即:在相同位置匹配):

use strict;
$\ = "\n"; $, = "\t";
my $path='assign-e398846de42d98b1f79109926d0da510.json';
print($path);
print $path =~ /([\w\d]{8,})/;

但是 python 脚本的输出是:

assign-e398846de42d98b1f79109926d0da510.json
None
None

和 perl returns:

assign-e398846de42d98b1f79109926d0da510.json
e398846de42d98b1f79109926d0da510

这是为什么?如何在 python?

中捕获路径名中的 32 字符 md5 哈希

md5-

尝试这个正则表达式
re.findall(r"([a-fA-F\d]{32})", data)

#output
['e398846de42d98b1f79109926d0da510']

此外,您需要使用 re.search 而不是 re.match

re.search('[\w\d]{8,}', path).group(0)

#output
'e398846de42d98b1f79109926d0da510'

使用 m.search 而不是 m.match。后者只匹配字符串的开头。