2015-12-02 72 views
0

的第二组的所有我有点憋屈的正则表达式(Python的初学者),我这里有一个字符串“12x4x67”,我需要了分裂数为变量,例如:长度,宽度和高度。我已经成功地获得了第一组。现在我需要匹配第二组。这里是我用我做的例子使用的正则表达式测试器的链接。蟒蛇正则表达式“12x4x67”比赛只有数

这是我regex

\d+ 

只匹配340x9x20340

+0

见[此演示](https://regex101.com/r/hJ1lU8/4)。有1个差:)然而,我想['(ΔP \ d +)×(2 P \ d +)×(2 P \ d +)'](https://regex101.com/r/mN3rS3/1 )会更好,您将可以通过指定组访问任何部件。 –

+0

可以使用['\ d + \ d +(\ d +)'](https://regex101.com/r/hJ1lU8/7)和使用捕获的组#1 – anubhava

+0

真棒!我之前也有同样的事情,但我只想要第二场比赛,你知道我怎么能做到这一点?或者像每个比赛一样的foreach循环做到这一点? – IceTimux

回答

1

如果输入总是有全部三个部分 - 长度,宽度和高度 - 您可以使用

(?P<l>\d+)x(?P<w>\d+)x(?P<h>\d+) 

regex demo

使用命名捕获,你就可以通过访问任何部件一个命名组。

例子:

import re 
p = re.compile(r'(?P<l>\d+)x(?P<w>\d+)x(?P<h>\d+)') 
test_str = "340x9x20" 
m = p.search(test_str) 
if (m): 
    print m.group("w") # => prints "9" (width) 
+0

这真是太棒了,我现在怎么把l的匹配变成可变长度? – IceTimux

+0

你能澄清一下吗? 'l'的值可以用'm.group(“l”)'获得。然后,你可以用它做任何事情。 –

+1

非常感谢您的时间和耐心!它的工作原理,团队的概念对我来说有点混乱,但我现在完全理解它们! – IceTimux

2

无需正则表达式:

length, width, height = "12x4x67".split('x') 

或者如果你喜欢处理整数:

length, width, height = [int(s) for s in "12x4x67".split('x')] 
+0

哇这也是一个不错的解决方案,没有正则表达式所需的这一个,谢谢 – IceTimux

1

我宁愿分裂的做法,而是要回答你的关于正则表达式的问题 - 这将使用\d+找到所有发生:

lwh = "340x9x20" 
numbers = [int(n) for n in re.findall("\d+", lwh)] 
print(numbers)  # [340,9,20] 

这可以通过使用预编译的正则表达式进行优化。