0

我在处理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']

并得到我一直在寻找的东西。然后,基于这个线程,我尝试findall()在整个 regex -> 中添加一个组r'((\d)\2*)'。我最终得到:

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

在这一点上,我很困惑。我知道这个结果与多个组有关,但我不确定。

另外,这是我第一次发帖,如果我的礼仪不正确,我深表歉意。请随时纠正我。谢谢!

4

1 回答 1

1

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

finditer方法返回MatchObject实例。您想查看这些.group()方法并仔细阅读文档。想想两者之间有什么.group(0)区别.group(1);平原.group()是一样的.group(0)

至于\d转义字符;因为该特定的转义组合作为 Python 字符串转义字符没有任何意义,Python 会忽略它并将其保留为反斜杠和字母d。使用文字字符串格式确实会更好r'',因为当您确实想要使用正则表达式字符集时,它可以防止令人讨厌的意外,而该字符集恰好也是 python 可以识别的转义序列。有关详细信息,请参阅有关字符串文字的 python 文档

您的.findall()withr'((\d)\2*)'表达式每次匹配返回 2 个元素,因为您的模式中有 2 个组;外、整组匹配(\d)\2*和内组匹配\d。从.findall()文档中:

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

于 2012-07-23T16:21:53.697 回答