我正在尝试捕获十进制英寸语句中的数字而不捕获"
. 在 Perl 中运行良好的表达式在 Python 中似乎失败了,我不明白为什么。
在以下两个表达式中,我希望看到1
,1.5
但在 Python 中看到1"
,1.5"
并且我希望它们能够正常工作。我错过了什么?
珀尔:
DB<15> x '1"' =~ m{^(?:(\d+(?:\.\d+)*)")}
0 1
DB<16> x '1.5"' =~ m{^(?:(\d+(?:\.\d+)*)")}
0 1.5
Python:
>>> re.search(r'^(?:(\d+(?:\.\d+)*)")', '1"').group()
'1"'
>>> re.search(r'^(?:(\d+(?:\.\d+)*)")', '1.5"').group()
'1.5"'
最终,我希望使用如下表达式:^(?:(\d+)\')|(?:(\d+(?:.\d+)*)") 来匹配 1' 或 1" 或 1.5"并通过匹配的位置,告诉哪个表达式有效。hwnd 指出了我之前忽略的“findall”,所以我希望我的解决方案看起来像:
>>> re.findall(r'^(?:(\d+)\')|(?:(\d+(?:\.\d+)*)")', '1\'')
[('1', '')]
>>> re.findall(r'(?:(\d+)\')|(?:(\d+(?:\.\d+)*)")', '1\' 1" 1.5"')
[('1', ''), ('', '1'), ('', '1.5')]
这是使用 finditer/groupdict/comprehension 的另一个有趣的可能性:
>>> [m.groupdict() for m in re.finditer(r'(?P<feet>(\d+)\')|(?P<inches>(\d+(?:\.\d+)*)")', '1\' 1" 1.5"')]
[{'feet': "1'", 'inches': None},
{'feet': None, 'inches': '1"'},
{'feet': None, 'inches': '1.5"'}]
感谢大家对 Python 的另一次启发之旅。