[英]Python Dataframe - Extract multiple lines between regex match
我正在处理一个python 3.x项目,该项目需要读取需要过滤的大TXT文件(例如,删除多个空格,空行,以某些字符串开头的行等),最后通过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的删除/过滤速度很快,而常规字符串的分割更容易。
有任何想法吗?
谢谢!
编辑。 这是我的原始文本的样子。 如您所见,这是一团糟(摘自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
您可以使用并将其全部读取到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
论据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='|')
如果不需要或为空,请按列号删除列:
df = df.drop(df.columns[[0, 1, 3]], axis=1)
要清除列2中所有值中的多余空格:
df[2] = [' '.join(x.split()) for x in df[2]]
或在整个DataFrame上清除空白:
cleaner = lambda x: ' '.join(x.split()) if isinstance(x, str) else x
df = df.applymap(cleaner)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.