Skip to main content
 首页 » 编程设计

python之检查字符串 Python 中的模式

2025年05月04日22arxive

假设我们有以下类型的字符串:

test= '--a-kbb-:xx---xtx:-----x--:---g-x--:-----x--:------X-:XXn-tt-X:l--f--O-' 

也就是说,它们总是由 : 分隔的 8 个部分组成,因此可以将字符串拆分成一个列表,每个元素对应一个部分:

testsep = test.split(':') 

给予

['--a-kbb-', 'xx---xtx', '-----x--', '---g-x--', '-----x--', '------X-', 'XXn-tt-X', 'l--f--O-'] 

现在我想检查字符串 test 是否在 3 个连续的部分中有一个 x 出现在该部分的相同位置。比如上面给出的test,我们发现至少有一种情况:从1开始算起,sections 2,3,4在同一位置有一个x,即在索引 6 处。因此,我们的测试字符串与所需的模式匹配。

  • 是否有一种简单的(也许是功能性的方式)来检查给定字符串的这种模式,这些字符串总是由上述格式组成?

天真的方法是拆分,然后遍历所有部分并查看是否有连续部分在每个可能的位置(第一个索引 1、2、...向上)具有 x到 8),但这不太像 python。

请您参考如下方法:

一种可能性是将 itertools.groupby 与 class 一起使用,以对在同一位置具有 x 的字符串运行进行分组:

from itertools import groupby 
class X: 
  def __init__(self, _x): 
    self.x = _x 
  def __eq__(self, _val): 
    return any(a == 'x' and b =='x' for a, b in zip(self.x, _val.x)) 
 
d = ['--a-kbb-', 'xx---xtx', '-----x--', '---g-x--', '-----x--', '------X-', 'XXn-tt-X', 'l--f--O-'] 
result = [[a, [i.x for i in b]] for a, b in groupby(list(map(X, d)))] 
final_result = [b for _, b in result if any(all(h == 'x' for h in c) for c in zip(*b))]  

输出:

[['xx---xtx', '-----x--', '---g-x--', '-----x--']] 

然而,使用朴素的方法要简单得多,事实上,解决方案非常 Pythonic:

def group(d): 
  start = [d[0]] 
  for i in d[1:]: 
    if any(all('x' == c for c in b) for b in zip(*(start+[i]))): 
       start.append(i) 
    else: 
       if len(start) > 1: 
         yield start 
       start = [i] 
 
print(list(group(d))) 

输出:

[['xx---xtx', '-----x--', '---g-x--', '-----x--']]