【问题标题】:Python 3.5 Regular expressions cannot read text file [closed]Python 3.5 正则表达式无法读取文本文件 [关闭]
【发布时间】:2016-01-03 17:12:16
【问题描述】:

将文本文件转换为文档字符串(与文字字符串相同)以使正则表达式工作是否是个好主意?我尝试将其转换为带有str() 的字符串,并在re 中使用多行模式。

我创建了一个基本脚本来通过 Python 解析出EnCase 导出文件。它可以工作,但由于某种原因,我无法获取正则表达式代码来执行 findall 函数来搜索文件,除非我将文件的内容作为 doc 字符串存储在变量中。

file = '''

'''

似乎这段代码可以用于不同的文件,但是复制和粘贴每个文件内容变得很麻烦。还有其他建议吗?

EnCase 文件导出本质上是制表符分隔的,以下是有关文件格式的信息。

另见:Exporting Files and Folder from EnCase

【问题讨论】:

  • 请澄清您的问题。人们知道 EnCase 文件是什么或它们的外观的可能性非常小,请带来有意义的输入样本、代码尝试以及最重要的是这些样本的预期输出。
  • 我尝试在这个论坛和 github 上粘贴文件格式,但它只是去掉了标签和回车。这是我所拥有的github.com/jshen9393/data_wrangling/blob/master/…
  • 花几分钟时间熟悉一下这个网站是如何运作的,以及 Markdown 是如何运作的。这是一个关于编程的问答网站,它完全能够保留换行符和制表符,您只是懒得阅读说明。
  • 谢谢!我将审查 QA。也许我也把这个问题弄得太详细了。如何加载像文档字符串这样的文本文件?
  • 这是一个非常非常基本的问题,如果这是您的实际问题。浏览一下 Python 文档,在 Internet 上四处看看。你会发现数以千计的例子。

标签: python regex validation text-parsing encase


【解决方案1】:

只需阅读文件。这会给你一个字符串:

In [2]: with open('encase_example.md') as cf:
   ...:     data = cf.read()
   ...:     

In [3]: data[:41]
Out[3]: '\n1)\nName\tfile.doc\nFile Category\tDocument\n'

(仅显示部分字符串作为示例。)

请注意数据中每条记录的字段之间有换行符,但每个字段的键和值之间有制表符。我们稍后会用到它。

这适用于正则表达式:

In [14]: re.findall('Full Path.*', data)
Out[14]: 
['Full Path\tproject\\D\\analysis\\system\\folder\\file.doc',
 'Full Path\tproject\\D\\analysis\\system\\folder\\file2.doc']

如果要分隔记录,只需在\n\n 上拆分:

In [18]: records = data.split('\n\n')

In [19]: len(records)
Out[19]: 2

In [20]: records[0][:50]
Out[20]: '\n1)\nName\tfile.doc\nFile Category\tDocument\nFile Type'

你也可以把记录做成字典:

In [35]: dict([ln.split('\t') for ln in records[0].splitlines()][2:])
Out[35]: 
{'Entry Modified': '12/18/14 11:18:53AM',
 'File Acquired': '04/28/15 01:54:45PM',
 'File Category': 'Document',
 'File Created': '03/29/14 03:22:59PM',
 'File Deleted': '',
 'File Type': 'Word Document',
 'Full Path': 'project\\D\\analysis\\system\\folder\\file.doc',
 'Is Deleted': '',
 'Last Written': '08/18/08 01:20:48PM',
 'Name': 'file.doc',
 'Physical Location': '546,930,589,696',
 'Physical Size': '32,768'}

【讨论】:

  • 谢谢!这可能没有解决我的问题,但它给了我一种诊断它的方法。我相信这是一个编码问题,因为我使用了 data[:41] 并想出了这个:'ÿþK\x00a\x00r\x00i\x00n\x00a\x00 \x00r\x00e\x00s\x00u\x00l\x00t\x00s\x00 \x00#\x001\x00 \x00f\x00i' 我相信这是某种 Windows 编码,这就是我的正则表达式无法正常工作的原因。我将不得不开始阅读有关将其转换为 UTF8 的信息。
  • @JimmyShen 你用的是 Python2 还是 Python 3?
  • 3.5 我相信我有一个代码可以将源文件转换为 utf-8 import chardet encoding = 'UTF-8' with open(file,'rb') as file: file = file.read () file_encoding = chardet.detect(file) file_encoding = file_encoding['encoding'] if encoding not in file_encoding: print('converting file encoding to utf-8') data = file.decode(file_encoding).encode(encoding) else : print('文件编码为utf-8') data = file data = data.decode(encoding)
  • 在使用 'utf-16' 文件执行上述操作时出现以下错误:'utf-8' codec can't decode byte 0xff in position 0: invalid start byte' 看起来像它相当于将西班牙语翻译应用于法语文本。编码字段似乎只有在它不是默认编码并且您知道时才应该填充它。
  • 是的。你应该 有趣的是,我从你的 github 帐户下载的文件不是 UTF-16 编码的。看看import sys; sys.getdefaultencoding() 为您返回的内容。如果不是 UTF-16,那么这可能是您的问题的原因。我无法识别您评论中的 BOM(字节顺序标记):bytes([255, 254]).decode('latin-1') = 'ÿþ'
猜你喜欢
  • 2015-11-23
  • 1970-01-01
  • 2016-07-25
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
相关资源
最近更新 更多