匹配文件中的空白行

时间:2019-01-30 19:40:15

标签: python regex newline blank-line

1。匹配文件中空白行的最可靠方法是什么?

2。匹配文件中空白行的最有效的方法是什么?

3。以下几种匹配空白行的方式有什么区别?

上下文:

我正在尝试在Python中检测文件中的空行的过程中了解一些可能的陷阱。

我可以想到五种定义方式:

  1. 空白:使用正则表达式匹配空白行^$
  2. NEWLINES:使用正则表达式匹配换行符^\r?\n
  3. Emptys:匹配空字符串''
  4. PNEWLINES:匹配换行符'\n'
  5. STRIPS:用strip()删除行,然后匹配一个空字符串。
[nav] In [3]: i = 0
         ...: fin = open('warandpeace.txt', 'rt')
         ...: blanks = []
         ...: empties = []
         ...: newlines = []
         ...: pnewlines = []
         ...: strips = []
         ...: NEWLINE = re.compile(r'^\r?\n')
         ...: BLANK = re.compile(r'^$')
         ...: for line in fin:
         ...:     if re.search(BLANK, line):
         ...:         blanks.append((i, line))
         ...:     if re.search(NEWLINE, line):
         ...:         newlines.append((i, line))
         ...:     if line == '':
         ...:         empties.append((i, line))
         ...:     if line == '\n':
         ...:         pnewlines.append((i, line))
         ...:     if line.strip == '':
         ...:         strips.append((i, line))
         ...:     i += 1

[nav] In [4]: print((len(blanks), len(empties), len(newlines), len(pnewlines), len(strips)))
(13892, 0, 13892, 13892, 0)

尽管我得到了统一的结果,但它们似乎不是等效的。我的输入是War and Peace by Leo Tolstoy from Project Gutenberg的utf-8文本副本,我相信它是Windows行尾。我不确定还有什么可以测试的。

我观察到以下情况:

  • Blanks和NEWLINES都可以跨平台移植(即,能够处理Windows行尾(实际上我并不了解Mac)。
  • 很明显,EMPTIES方法失败,因为从文件中读取行保留了\n,因此它不是空字符串。
  • 在Windows行尾的情况下,PNEWLINES方法将失败。
  • 我不知道STRIPS方法为何失败。我以为它会删除开头和结尾的空白,所以应该可以。
  • 如果空白行中有空格,所有这些都将失败,这对于regex方法而言(这是无关紧要的)很容易解决。

我关心的是匹配空白行的最可靠的方法。我一直将'^$'与sed一起使用,但是老实说,在Python中,我什至不了解行是如何分割的!尽管Python在换行符上进行了拆分,但仍保留了新行,这似乎很奇怪,而且对我来说是违反直觉的。

除了表面上的区别,所有这些之间的真正区别是什么?例如,为什么'^$''^\r?\n'等价?最好的方法是什么?还有什么其他方法?

1 个答案:

答案 0 :(得分:1)

这就像理论问题,但遵循这种逻辑的简单方法。

with open(file,'r') as out:
    lines = out.readlines()

for line in lines:
    if len(line.strip()) == 0:
        print('Empty')