如何在 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))
我正在尝试开发一个可以使用 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))