【问题标题】:How to grep for unicode characters?如何grep unicode字符?
【发布时间】:2018-02-19 02:19:54
【问题描述】:

如何使用 grep 在文件中搜索一串 unicode 字符?

我正在尝试计算字符串“\xfe\n\xfe”的出现次数。我可以通过以下方式使用 Python 找到它:

open(filename).read().count('\xfe\n\xfe')

这会找到几千个匹配项。

但是,由于这会将整个文件加载到内存中,如果我尝试搜索大于系统内存的文件,则会崩溃。

所以我试图通过 grep 来做同样的事情:

grep -P -c "\xfe\n\xfe" filename

它几乎消耗了 0 个内存,这很棒,但即使我在同一个文件上运行它,它也会找到 0 个匹配项。我的语法有什么问题?

【问题讨论】:

  • grep 以行为单位运行。
  • 您不必在 python 中将整个文件读入内存。或者,给定一个健全的终端(至少,一个与您的文件使用相同编码的终端),您可以只粘贴字符而无需转义。即grep þ 有效。
  • 我已经在文件中测试了 160000 行(包含 40000 个匹配项)。在这种情况下,Python 会比 grep 快得多。 @Moses Koledoye 的解决方案应该可以正常工作

标签: python regex unicode grep


【解决方案1】:

您不需要将整个文件读入内存。您可以迭代文件并计算该字符串在每行中出现的次数:

count = 0
with open(filename) as f:
   prev_line = next(f)
   for line in f:
      if prev_line.endswith('\xfe\n') and line.startswith('\xfe'):
         count += 1
      prev_line = line

【讨论】:

    【解决方案2】:

    所以我试图通过 grep 来做同样的事情:

    grep -P -c "\xfe\n\xfe" filename
    

    它消耗几乎 0 内存,即 太好了,但即使我在同一个文件上运行它,它也会找到 0 火柴。我的语法有什么问题?

    问题在于grep 是基于行的,并且不会与\n 换行符匹配模式。有跨换行符匹配模式的 grep 变体,例如ugrep

    ugrep -c "\xfe\n\xfe" filename
    

    另外一个好处是,如果需要,ugrep 会为二进制匹配生成 hexdump。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 2011-10-16
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多