我试图捕获十进制英寸语句中的数字,而不捕获"
。一个在Perl中运行良好的表达式在Python中似乎失败了,我不明白为什么。
在下面的两个表达式中,我希望看到1
和1.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
蟒蛇:
>>> 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。
最佳答案
你很容易做到。。
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
关于python - Perl正则表达式与Python正则表达式非捕获功能似乎有所不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18237403/