如何在 python 2 中识别和打印 ascii 文件中的模式?

how to identify and print a pattern inside an ascii file in python 2?

我正在尝试开发一个可以使用 Python 2.x 从 txt 文件中读取模式的程序。这种模式应该是一个错误:

| |
###O
| |

并且该模式不包含空格。

到目前为止,我想出了一种打开 txt 文件、读取它并处理其中数据的方法,但我想不出一种方法让 Python 将这种模式理解为 1 , 而不是计算每个字符。我试过正则表达式,但最终显示的输出类似于:

| |
###O
| | 
   | |
   ###O
   | |
         | |
         ###O
         | |

而不只是说在文件中检测到多少这种模式,例如:

There were 3 occurrences.

更新: 到目前为止我得到了这个

file = open('bug.txt', 'r')
data = file.read() #read content from file to a string
occurrences = data.count('| |\n\'###O\'\n| |\n')

print('Number of occurrences of the pattern:', occurrences)

但这不起作用。文件本身有 3 次模式,但中间有空格,但空格不是模式的一部分,当我尝试从文件中粘贴模式时,它会中断行,如果我将模式更正为 | | ###O | |它显示 0 次出现,因为它不是真正的模式。

这取决于您存储 ASCII 数据的方式,但如果将其转换为字符串,则可以使用 python.count() 函数。

例如:

# define string
ascii_string = "| | ###O | | | | ###O | | | | ###O | |"
pattern = "| | ###O | |"

count = ascii_string.count(pattern)

# print count in python 3+
print("Occurrences:", count)

# print count in python 2.7
print "Occurrences:", count

这将导致:

Occurrences: 3
>>> import re
>>> data = '''| |
... ###O
... | |
...    | |
...    ###O
...    | |
...          | |
...          ###O
...          | |'''
>>> result = re.findall('[ ]*\| \|\n[ ]*###O\n[ ]*\| \|', data)
>>> len(result)
3
>>>

结果出现。

如何从文件中做到这一点:

import re
with open('some file.txt') as fd:
    data = fd.read()
result = re.findall('[ ]*\| \|\n[ ]*###O\n[ ]*\| \|', data)
len(result)

在 OP 上进行编辑的替代方法:

>>> data = '''| |
... ###O
... | |
...    | |
...    ###O
...    | |
...          | |
...          ###O
...          | |
... | | ###O | |'''
>>> data.replace('\n', '').replace(' ', '').count('||###O||')
4
>>> 

我就这样解决了问题

def somefuntion(file_name):
    ascii_str = ''
    with open(file_name, 'r') as reader:
        for line in reader.readlines():
            for character in line.replace('\n', '').replace(' ', ''):
                ascii_str += str(ord(character))
        return ascii_str

if __name__ == "__main__":
    bug = somefuntion('bug.txt')
    landscape = somefuntion('landscape.txt')
    print(landscape.count(bug))