我在处理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')]
此时我各种各样的困惑。我知道这个结果与多个小组有关,但我不确定。
另外,这是我第一次发帖,所以如果我的礼节不正确,我会道歉。请随时纠正我。谢谢!
答案 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:
如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。