这个正则表达式到底是如何工作的?

2024-04-24 10:16:20 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我在学习python,我根本不知道正则表达式在这个Look-and-Say sequence中是如何工作的。你知道吗

我试过阅读文档,我理解方法是如何工作的,但我不知道for循环在那里是如何适应的。你知道吗

import re

lookAndSay = "1"

lookAndSay = "".join([str(len(j) + 1) + i for i, j in re.findall(r"(\d)(\1*)", lookAndSay)])
print(LookAndSay)

输出为

11


Tags: and方法in文档importreforlen
2条回答

其中的regex函数部分re.findall(r"(\d)(\1*)", lookAndSay)分解为:

在字符串lookAndSay中查找出现一个数字(0-9)的所有匹配项,然后查找与第一组匹配的第二组匹配项。\1是识别先前模式的方式。在这个例子中\1*=(\d)*,这意味着匹配它所看到的任意数量的数字。你知道吗

其效果是:

>>> temp = "1"
>>> import re
>>> re.findall(r"(\d)(\1*)",temp)
[('1', '')]
>>> temp = "11"
>>> re.findall(r"(\d)(\1*)",temp)
[('1', '1')]
>>> temp = "111111"
>>> re.findall(r"(\d)(\1*)",temp)
[('1', '11111')]

该行上该函数的其余部分是一个联接,它联接在一起找到的两组匹配项(没有空格)。你知道吗

如果没有第二种模式,\1findall的结果如下所示:

>>> re.findall(r"(\d)",temp)
['1', '1', '1', '1', '1', '1']

如果你把兴趣线放进一个循环中,你就有希望对发生的事情有一个更好的印象:

import re

lookAndSay = "1"

for i in range(5):
    print (lookAndSay)
    lookAndSay = "".join([str(len(j) + 1) + i for i, j in re.findall(r"(\d)(\1*)", lookAndSay)])

正则表达式(\d)(\1*)匹配(并捕获)给定字符串中的所有对

  1. 数字(\d)
  2. 相同数字的尾随重复(\1*)如果有的话(空字符串)

正如huma474已经指出的,regex中的(\1*)是一个捕获回引用。\1意味着“你在第一对括号中捕获的内容”;第二对括号将由\2寻址,依此类推。。。你知道吗

顺便说一句:我发现包含python的东西比regex本身要复杂得多。你知道吗

附录:关于芬德尔解释

为了理解regex的部分,将这两行代码添加到上面的脚本中会有所帮助:

print (lookAndSay)
print (re.findall(r"(\d)(\1*)", lookAndSay))

看看它的输出:

1
11
21
1211
111221
312211
[('3', ''), ('1', ''), ('2', '2'), ('1', '1')]

最后两行是

  • 最后的迭代阶段和
  • 关于所使用正则表达式的描述:
    • (\d)匹配3(\1*)匹配``(不再3
    • (\d)匹配1(\1*)匹配``(不再1
    • (\d)匹配2(\1*)匹配2(另一个2
    • (\d)匹配1(\1*)匹配1(另一个1

如前所述,re.findall如果正则表达式中有多个捕获组,则返回元组列表。你知道吗

相关问题 更多 >