如何在输入字符串中查找模式

时间:2019-01-12 23:19:07

标签: python

我需要在文本文件中找到给定的模式并打印匹配的模式。文本文件是一串数字,并且模式可以是任何以'X'表示的数字串或占位符。

我发现解决此问题的方法是将序列加载到变量中,然后创建可测试子序列的列表,然后测试每个子序列。这是我在python中的第一个函数,因此我对如何轻松创建测试序列列表然后进行测试感到困惑。

def find(pattern):  #finds a pattern in the given input file
    with open('sequence.txt', 'r') as myfile:
        string = myfile.read()

    print('Test data is:', string)

    testableStrings = []

    #how to create a list of testable sequences?

    for x in testableStrings:
        if x == pattern:
            print(x)

    return

例如,在“ 11012102”中搜索“ X10X”应打印“ 1101”和“ 2102”。

2 个答案:

答案 0 :(得分:0)

pattern = "X10X"string = "11012102"n = len(pattern)-仅用于以下说明:

不使用正则表达式,您的算法可能如下:

  1. 构造一个长度为n的字符串的所有子序列的列表:

    In[2]: parts = [string[i:i+n] for i in range(len(string) - n + 1)]
    In[3]: parts
    Out[3]: ['1101', '1012', '0121', '1210', '2102']
    
  2. 将模式与parts中的每个元素进行比较:

    for part in parts:
    
  3. patternpart(现在都具有相等的长度)的比较将是符号,符号在相应位置:

        for ch1, ch2 in zip(pattern, part):
    
  4. 如果ch1X符号或ch1 == ch2,则将继续比较对应的符号,否则我们将其中断:

            if ch1 == "X" or ch1 == ch2:
                continue
            else:
                break
    
  5. 最后,如果所有具有符号比较的符号均成功,则i。 e。所有成对的对应符号均已用尽 ,则将执行else语句的for分支(是的,for语句可能具有else分支)。

    现在,您可以使用匹配的part执行任何操作,例如G。打印它或将其附加到某些列表中:

        else:
           print(part)
    

所有这些都集中在一处:

pattern = "X10X"
string = "11012102"
n = len(pattern)

parts = [string[i:i+n] for i in range(len(string) - n + 1)]

for part in parts:
    for ch1, ch2 in zip(pattern, part):
        if ch1 == "X" or ch1 == ch2:
            continue
        else:
            break
    else:
        print(part)

输出:

1101
2102

答案 1 :(得分:0)

您可能想从输入文件的个单独行中创建可测试序列的列表。因此,代替

with open('sequence.txt', 'r') as myfile:
    string = myfile.read()

使用

with open('sequence.txt') as myfile:                       # 'r' is default
    testableStrings = [row.strip() for row in myfile]

strip()方法从行的开头和结尾删除空格字符,包括在行尾的\n符号。


sequence.txt文件的示例:

    123456789
87654321
 111122223333

print(testableStrings)命令的输出:

['123456789', '87654321', '111122223333']