所以我在学习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:
其中的regex函数部分
re.findall(r"(\d)(\1*)", lookAndSay)
分解为:在字符串
lookAndSay
中查找出现一个数字(0-9)的所有匹配项,然后查找与第一组匹配的第二组匹配项。\1
是识别先前模式的方式。在这个例子中\1*
=(\d)*
,这意味着匹配它所看到的任意数量的数字。你知道吗其效果是:
该行上该函数的其余部分是一个联接,它联接在一起找到的两组匹配项(没有空格)。你知道吗
如果没有第二种模式,
\1
,findall
的结果如下所示:如果你把兴趣线放进一个循环中,你就有希望对发生的事情有一个更好的印象:
正则表达式
(\d)(\1*)
匹配(并捕获)给定字符串中的所有对(\d)
(\1*)
如果有的话(空字符串)正如huma474已经指出的,regex中的
(\1*)
是一个捕获回引用。\1
意味着“你在第一对括号中捕获的内容”;第二对括号将由\2
寻址,依此类推。。。你知道吗顺便说一句:我发现包含python的东西比regex本身要复杂得多。你知道吗
附录:关于芬德尔解释
为了理解regex的部分,将这两行代码添加到上面的脚本中会有所帮助:
看看它的输出:
最后两行是
(\d)
匹配3
,(\1*)
匹配``(不再3
)(\d)
匹配1
,(\1*)
匹配``(不再1
)(\d)
匹配2
,(\1*)
匹配2
(另一个2
)(\d)
匹配1
,(\1*)
匹配1
(另一个1
)如前所述,re.findall如果正则表达式中有多个捕获组,则返回元组列表。你知道吗
相关问题 更多 >
编程相关推荐