我有一個從pdf中提取到文本的資料,格式如下:
text =
1
地址行 1
地址行 2
郵編
電話號碼
ID 號碼
日期
2
地址行 1
地址行 2
郵編
電話號碼
ID 號碼
日期
3
地址行 1
地址行 2
郵編
電話號碼
ID 號碼
日期
....
數字 1,2,3 應該是索引。現在我想撰寫一個回圈,為每個索引放入一個資料幀,以及它后面的資訊。所以結果將是一個類似的表格:
| 指數 | 地址 | 郵政編碼 | 電話號碼 | 身份證號碼 | 日期 |
|---|
我開始撰寫代碼,但我停留在正則運算式部分。如何在前瞻或后視部分中放置一個變數進行迭代?有什么解決辦法嗎?
import re
import pandas as pd
indexes = re.findall(r'(?<=\n)\d{1}(?=\n)', text)
# convert string to integer
for i in range(0, len(indexes)):
indexes[i] = int(indexes[i])
# extract the data
text
indexes
data = {}
for index in indexes:
next_index = index 1
index_value = re.search(r'(?<={index}).*(?={next_index})', text).group()
data[index] = index_value
謝謝!
uj5u.com熱心網友回復:
正則運算式的滑坡:如果你認為你會用正則運算式解決你的問題,你可能很快就會遇到兩個問題。
您的資料更容易決議。每條記錄占用 7 行,您已經知道哪一行包含哪條資料:
first_index = None
data = []
current = {}
for i, line in enumerate(text.split("\n")):
if first_index is None:
first_index = i if re.match("\d ", line) else None
if first_index is None or line == "":
continue
delta = (i - first_index) % 7
if delta == 0:
current["index"] = int(line)
elif delta == 1:
current["Address"] = line
elif delta == 2:
current["Address"] = f" {line}"
elif delta == 3:
current["ZipCode"] = line
elif delta == 4:
current["PhoneNumber"] = line
elif delta == 5:
current["IdNumber"] = line
elif delta == 6:
current["Date"] = line
data.append(current)
current = {}
df = pd.DataFrame(data)
一個更熊貓的解決方案,再次依賴于文本的每記錄 7 行結構:
from io import StringIO
col_names = ["index", "Address1", "Address2", "ZipCode", "PhoneNumber", "IdNumber", "Date"]
df = (
pd.read_csv(StringIO(text), header=None)
# pd.read_csv("data.txt", header=None) # alternative: read it directly from the file
.assign(a=lambda x: x.index // 7, b=lambda x: x.index % 7)
.set_index(["a", "b"])
.unstack()
.set_axis(col_names, axis=1)
.rename_axis(None)
)
a是記錄號(類似于index),b是記錄中行的位置。
這種方法的缺點是所有列都是字串,您必須手動將它們轉換為適當的資料型別。
uj5u.com熱心網友回復:
結合字串格式:
rf'(?<={index}).*(?={next_index})'
>>> import re
>>> index=4
>>> next_index=5
>>> re.search(rf'(?<={index}).*(?={next_index})', '...4something5...')
<re.Match object; span=(4, 13), match='something'>
如果您最終不得不在模式中使用大括號,請將它們加倍:
>>> a="a"
>>> re.search(rf'{a}{{3}}', 'aaaa')
<re.Match object; span=(0, 3), match='aaa'>
uj5u.com熱心網友回復:
采用:
s = pd.read_csv('file.txt', header=None)
is_digit = s[0].str.isdigit()
index = (is_digit & (~is_digit.shift(-1, fill_value=False))).cumsum()
columns = index.groupby(index).cumcount()
new_df = \
s.pivot_table(index=index,
columns=columns,
aggfunc='first', values=0)\
.set_axis(['index', 'Address 1', 'Address 2',
'ZipeCode', 'Phone Number',
'ID Number', 'Date'], axis=1)
new_df = new_df.assign(Address=new_df['Address 1'].str.cat(new_df['Address 2'], ' '))\
.drop(['Address 1', 'Address 2'], axis=1)
print(new_df)
index ZipeCode Phone Number ID Number Date \
0
1 1 Zipe Code Phone number ID number Date
2 2 Zipe Code Phone number ID number Date
3 3 Zipe Code Phone number ID number Date
Address
0
1 Address line 1 Address line 2
2 Address line 1 Address line 2
3 Address line 1 Address line 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/453912.html
上一篇:從檔案路徑中選擇檔案名:無效的perl運算子:(?=
下一篇:節點-如何替換部分url
