2
我想在另一个字符串中找到模式([A-Z][0-9]+)+
的子字符串。要做到这一点为什么re.findall匹配字符串,但没有正确返回结果?
一种方法是:
import re
re.findall("([A-Z][0-9]+)+", "asdf A0B52X4 asdf")[0]
奇怪的是,这会产生'X4'
,不'A0B52X4'
,这是我所期望的结果。
挖了一下成这样,我也试过,只是搭配简单的团体字符串组成:
re.findall("[A-Z][0-9]+", "asdf A0B52X4 asdf")
其产生预期的结果:['A0', 'B52', 'X4']
而且更加有趣:
re.findall("([A-Z][0-9]+){3,}", "asdf A0B52X4 asdf")
其中产量['X4']
,但似乎仍匹配我感兴趣的整个字符串,这是通过尝试re.search
以及使用该结果来手动获得子串:
m = re.search("([A-Z][0-9]+)+", "asdf A0B52X4 asdf")
m.string[m.start():m.end()]
这产生'A0B52X4'
。
现在从我所知道的python正则表达式中,括号不仅仅匹配里面的RE,而且还声明了一个“组”,它可以让你用它做各种事情。我的理论是,由于某种原因,re.findall
只将组中的最后一个匹配放入结果字符串中,而不是完整匹配。
为什么re.findall
的行为如此?
我关闭这个问题作为一个重复[如何捕获组在JavaScript正则表达式的任意号码?](HTTP ://stackoverflow.com/questions/3537878/how-to-capture-an-arbitrary-number-of-groups-in-javascript-regexp)。这个问题当然不是JavaScript,但是这是同样的问题,很好的解释,你可以应用相同的答案。 – Kobi
这绝对不是这个问题的最佳解决方案,因为Python're.findall'方法非常具体,并且以与JS方法相比更加不同的方式处理正则表达式。 –