Python正则表达式:如何解析字符串中重复的分组?

3
我想用一个模式匹配纯数字字符串,比如 '2324235235980980',使用以下描述的模式:
该模式为 '2-6-8-7-4',模式从2开始,转移到6,可以在6处循环,也可以转移到8,然后可以在6和8之间来回循环,可以在8处循环,或者可以转移到7。对于7而言,还有一件事情就是可以发生7-8-6-8-7的循环。最后,7可以到达4,一旦到达4,模式就完成了。在此过程中,如果到达其他点,则必须重新从2开始计算。
我使用了HTML标签。
import re    
re.findall(r'(2((6+8+)+)7)', test_string)

输出包括'2666686888668887',但是当我加上4时,我不知道该如何编译。有人有想法吗?非常感谢!

当你说“它可以在6和8之间来回运动,可以在8处进行自循环,或者可以转移到7”时,这是否意味着它可以走6-8-6-7,还是需要先返回8再去7? - CAustin
此外,当您说“7的同样的事情”时,您确切指的是什么?是8在6和自身之间来回移动的属性吗?如果您提供一个有效和无效字符串列表,概述尽可能多的边缘情况,那将会很有帮助。 - CAustin
为什么要使用 [perl] 标签,如果这是一个 Python 的问题? - tinita
把2-6-8-7-4看作是一个隧道,一旦你从2进入,在每个时间段内,你向隧道前进一步。你不会在中途打破隧道,而是可以在任何中间点停留任意长的时间。你也可以在中间点来回穿梭。一旦到达终点4,你就走出了隧道。 - Richard Riverlands
当我添加标签时,[perl] 是建议的标签之一... 很抱歉带来困惑。 - Richard Riverlands
显示剩余2条评论
2个回答

1

我认为这比最初预期的要容易实现:

26[68]+?[687]+?4

2后跟6后跟6 | 8后跟6 | 8 | 7后跟4。

唯一不太明显的部分是使模式变成惰性匹配。

这是一个更好的模式:

\b26?([^7]6|8|[^6]7)+?4\b

2后跟(非7)6 | 8 |(非6)7后跟4。


这真是太好了!完美地解决了我的问题!谢谢你! - Richard Riverlands
等一下,有一个问题。当我测试字符串'26876874'时,它匹配了不应该匹配的内容。你不能在一步中从7转换到6。只会出现'7-8-6-8-7-4',而不是'7-6-8-7-4'。你有什么想法来解决这个问题吗? - Richard Riverlands

0

我不确定我是否理解您的需求,但也许这可以为您工作:

string = "2666686888668887748926874"
index = [(m.start(0), m.end(0)) for m in re.finditer(r'2(6+8+)+7+\1?4', string)]
print(index)

输出:[(0, 18), (20, 25)]。

是一个包含每个出现的起始和结束索引的元组列表。


这可能对我的进一步探索有所帮助。感谢您的工作! - Richard Riverlands

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接