2

我正在尝试捕获十进制英寸语句中的数字而不捕获". 在 Perl 中运行良好的表达式在 Python 中似乎失败了,我不明白为什么。

在以下两个表达式中,我希望看到11.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 的另一次启发之旅。

4

3 回答 3

5

尝试:

re.search(r'^(?:(\d+(?:\.\d+)*)")', '1.5"').group(1)

参阅

group([group1, ...])

返回匹配的一个或多个子组。如果只有一个参数,则结果为单个字符串;如果有多个参数,则结果是一个元组,每个参数一个项目。如果没有参数, group1 默认为零(返回整个匹配项)。如果groupN参数为零,则对应的返回值是整个匹配字符串;如果在包含范围 [1..99] 内,则为匹配相应括号组的字符串。(强调我的

现在,您可以在 Perl(除非您使用非常旧的版本)和 Python 中使用命名捕获组。

所以,我实际上建议:

>>> re.search(r'^(?:(?P<inches>\d+(?:\.\d+){0,1})")', '1.5"').groupdict()['英寸']
'1.5'
于 2013-08-14T16:40:16.170 回答
1

你可以轻松做到..

import re

string = 'I have values "1" and "1.5" also "12.555"'
m = re.findall(r'\"(\d+|\d+\.\d+)\"', string)
print ", " . join(m)

输出:

1, 1.5, 12.555
于 2013-08-14T17:11:05.800 回答
0

您将尾随"放在组中。相反,请尝试:

re.search(r'^(?:(\d+(?:\.\d+)*))(?=")', '1.5"').group()
于 2013-08-14T16:42:33.480 回答