关于Python正则表达式和findall()的澄清

时间:2012-07-23 16:08:34

标签: python regex findall

我在处理Python Challenge时遇到了这个问题。准确地说是10号。我决定尝试使用正则表达式解决它 - 拉出重复序列,计算它们的长度,并在序列中构建下一个项目。

所以我开发的正则表达式是:'(\d)\1*'

它在在线regex tester上运行良好,但在我的脚本中使用它时却没有执行相同的操作:

regex = re.compile('(\d)\1*')
text = '111122223333'
re.findall(regex, text)

> ['1', '1', '1', '1', '2', '2', '2',...]

依此类推。所以我在Python的re模块中学习了原始类型。这是我的第一个问题:有人可以解释这究竟是什么吗?该文档将其描述为减少了逃避反斜杠的需要,但似乎并不需要更简单的正则表达式,如\d+,我不明白为什么。

所以我将我的正则表达式更改为r'(\d)\1*',现在尝试使用findall()来制作序列列表。我得到了

> ['1', '2', '3']

再次非常困惑。我还是不明白这一点。请帮忙吗?

我决定这样做来解决这个问题:

[m.group() for m in regex.finditer(text)]
> ['1111', '2222', '3333']

得到我一直在寻找的东西。然后,基于this主题,我尝试findall()向整个正则表达式添加一个组 - > r'((\d)\2*)'。 我最终得到了:

> [('1111', '1'), ('2222', '2'), ('3333', '3')]

此时我各种各样的困惑。我知道这个结果与多个小组有关,但我不确定。

另外,这是我第一次发帖,所以如果我的礼节不正确,我会道歉。请随时纠正我。谢谢!

1 个答案:

答案 0 :(得分:1)

由于这是挑战,我不会给你一个完整的答案。然而,你走在正确的轨道上。

finditer方法返回MatchObject instances。您想查看这些.group() method并仔细阅读文档。想一想.group(0).group(1)之间的区别;普通.group().group(0)相同。

至于\d转义字符;因为特定的转义组合没有作为python字符串转义字符的含义,Python忽略它并将其保留为反斜杠和字母d。使用r''文字字符串格式确实会更好,因为当想要使用也恰好是转义序列python的正则表达式字符集时,它可以防止令人讨厌的意外确实认识到。请参阅python documentation on string literals for more information

.findall() r'((\d)\2*)'表达式返回每个匹配2个元素,因为您的模式中有2个组;匹配(\d)\2*的外部整个组和匹配\d的内部组。来自.findall() documentation

  

如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。