我需要在文本文件中找到给定的模式并打印匹配的模式。文本文件是一串数字,并且模式可以是任何以'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”。
答案 0 :(得分:0)
让pattern = "X10X"
,string = "11012102"
,n = len(pattern)
-仅用于以下说明:
不使用正则表达式,您的算法可能如下:
构造一个长度为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']
将模式与parts
中的每个元素进行比较:
for part in parts:
pattern
与part
(现在都具有相等的长度)的比较将是符号,符号在相应位置:
for ch1, ch2 in zip(pattern, part):
如果ch1
是X
符号或ch1 == ch2
,则将继续比较对应的符号,否则我们将其中断:
if ch1 == "X" or ch1 == ch2:
continue
else:
break
最后,如果所有具有符号比较的符号均成功,则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']