gpt4 book ai didi

python - Perl 正则表达式与 Python 正则表达式非捕获似乎工作方式不同

转载 作者:行者123 更新时间:2023-11-28 21:22:48 35 4
gpt4 key购买 nike

我试图在不捕获 " 的情况下捕获小数英寸语句中的数字。在 Perl 中运行良好的表达式似乎在 Python 中失败,我不明白为什么。

在下面的两个表达式中,我希望看到 11.5 但在 Python 中看到的是 1"1.5" 并且我希望它们的工作方式相同。我错过了什么?

Perl:

  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 之旅。

最佳答案

尝试:

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

参见 re :

group([group1, ...])

Returns one or more subgroups of the match. If there is a single argument, the result is a single string; if there are multiple arguments, the result is a tuple with one item per argument. Without arguments, group1 defaults to zero (the whole match is returned). If a groupN argument is zero, the corresponding return value is the entire matching string; if it is in the inclusive range [1..99], it is the string matching the corresponding parenthesized group. (emphasis mine)

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

所以,我实际上会推荐:

>>> re.search(r'^(?:(?P<inches>\d+(?:\.\d+){0,1})")', '1.5"').groupdict()['inches']'1.5'

关于python - Perl 正则表达式与 Python 正则表达式非捕获似乎工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18237403/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com