Python Dataframe - 在正则表达式匹配之间提取多行

时间:2017-09-20 05:30:56

标签: python regex python-3.x pandas dataframe

我正在处理需要读取需要过滤的大型TXT文件的python 3.x项目(例如,删除多个空格,空行,以某些字符串开头的行等)和最后由REGEX匹配拆分。

我现在正在做的是使用pandas数据帧来存储每一行​​(这样可以使用pandas startswith()或endswith()轻松删除行。另一方面,通过让文本文件的每一行对应于DataFrame中的一行,我无法弄清楚如何在REGEX匹配之间提取数据。这是一个例子:

| 0 | REGEX MATCH   |
| 1 | data          |
| 2 | data          |
| 3 | REGEX MATCH   |
| 4 | data          |
| 5 | REGEX MATCH   |

所以问题是如何在匹配之间提取数据(在本例中,行0到2; 3到4和5)。这在大熊猫中甚至可能吗?

另一种选择是从文本文件中使用read()并进行DataFrame,过滤,拆分等常规字符串操作实例,我不确定它是否适用于大文本文件。在这种情况下,我在REGEX匹配之间有不需要的数据。例如:

str = "This is REGEX_MATCH    while between another \n \n\ REGEX_MATCH there is some    unwanted data"

在上面,我需要删除额外的空格,\ n,最后使用REGEX来分割匹配。唯一的问题是我的源文本文件非常大。

Pandas在删除/过滤方面很快,而常规字符串在分割时更容易。

有什么想法吗?

谢谢!

EDIT。这是我的源文本的样子。你可以看到它是一团糟(从PDF中提取)。每行都是pandas数据帧中的一行。问题是,是否可以提取包含一系列数字(包括那些行)的那些行之间的所有数据。

13 - 0005761-52.2014.4.02.5101                 Lorem ipsum dolor sit amet.
Quisque eget velit a orci consectetur pharetra. Aliquam.
\n
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
a
Lorem ipsum dolor sit amet.
        Lorem ipsum dolor sit amet - Sed ut tempus neque.
Sed ut tempus neque.
2 - 0117333-76.2015.4.02.5101 Lorem ipsum dolor sit amet

1 个答案:

答案 0 :(得分:1)

您可以使用并选择不包含匹配项的行将其全部读入DataFrame:

import pandas as pd

df = pd.read_csv('test.txt', header=None, delimiter='|') 
df = df[df[2].str.contains('MATCH') == False]  # check column 2 from the example

或者,您可以找到要忽略的行,然后使用skiprows的{​​{1}}参数:

pandas.read_csv

要按列号删除列,如果它们不需要或为空:

with open('test.txt') as f:
    lines = f.readlines()

skiprows = [i for i, line in enumerate(lines) if 'MATCH' in line]
df = pd.read_csv('test.txt', skiprows=skiprows, header=None, delimiter='|')

要清除第2列中所有值的额外空格:

df = df.drop(df.columns[[0, 1, 3]], axis=1)

或者清理整个DataFrame中的空白:

df[2] = [' '.join(x.split()) for x in df[2]]