Python:拆分一个字符串,在每个元素中保留相关信息
我试图从客户的数字笔记本中提取联系人信息,该笔记本中有如下条目: “\r\n导入的联系人:\r\n业务电话:9547711900第1行:2440Python:拆分一个字符串,在每个元素中保留相关信息,python,regex,python-3.x,pandas,data-cleaning,Python,Regex,Python 3.x,Pandas,Data Cleaning,我试图从客户的数字笔记本中提取联系人信息,该笔记本中有如下条目: “\r\n导入的联系人:\r\n业务电话:9547711900第1行:2440 东部商业大道。\r\n城市:劳德代尔堡\r\n州:佛罗里达州\r\n PostalCode:33308\r\n\r\nArt Womack推荐Steve Paul牙科医生 商业大道 区域。\r\n_womack@me.com>\r\n邦?皇冠?单板?\r\n\r\n\r\n' 拆分之后,我的目标是创建一个包含相关数据的元素列表(大部分元素中间包含“:”
东部商业大道。\r\n城市:劳德代尔堡\r\n州:佛罗里达州\r\n PostalCode:33308\r\n\r\nArt Womack推荐Steve Paul牙科医生 商业大道 区域。\r\n_womack@me.com>\r\n邦?皇冠?单板?\r\n\r\n\r\n' 拆分之后,我的目标是创建一个包含相关数据的元素列表(大部分元素中间包含“:”),以便稍后将其转换为python字典 我已经尝试过用“\r”和“\r”字符来分解字符串,但是我一直缺少第1行:yadayada信息 我想要的是:
['BusinessPhone : 9547711900','BusinessPhone : 9547711900',
'Line1 : 2440 East Commercial Blvd.', 'City : Ft. Lauderdale',
'State : FL', 'PostalCode : 3330']
您是如何尝试清理数据的?可以使用“\r\n”作为分隔符来分解现有的示例数据。您可以根据列表中的字符串是否为空来筛选拆分后的列表。这可以作为一个基本的数据清理过程来完成。你自己决定的相关部分 清洁的基本代码可以是:
mystr = '\r\nContact Imported:\r\nBusinessPhone : 9547711900 Line1 : 2440 East Commercial Blvd.\r\n City : Ft. Lauderdale\r\n State : FL\r\n PostalCode : 33308\r\n\r\nArt Womack recommends Steve Paul Dentist on Commercial Blvd area.\r\nA_womack@me.com>\r\nBond? Crowns? Veneer?\r\n\r\n\r\n'
data = mystr.split('\r\n')
data_filtered = list(filter(lambda x: x, data))
for d in data_filtered:
print(d.strip())
这将输出:
Contact Imported:
BusinessPhone : 9547711900 Line1 : 2440 East Commercial Blvd.
City : Ft. Lauderdale
State : FL
PostalCode : 33308
Art Womack recommends Steve Paul Dentist on Commercial Blvd area.
A_womack@me.com>
Bond? Crowns? Veneer?
你仍然需要弄清楚什么是重要的
编辑:基于此给定字符串,您可以使用:
def convert(x):
d = x.split(':')
newlist = []
if len(d) > 2:
# Hack will work only in few cases, including this case
vals = d[1].strip().split(' ')
newlist.append(f'{d[0]}:{vals[0]}')
newlist.append(f'{vals[1]}:{d[2]}')
return newlist
return [x]
mystr = '\r\nContact Imported:\r\nBusinessPhone : 9547711900 Line1 : 2440 East Commercial Blvd.\r\n City : Ft. Lauderdale\r\n State : FL\r\n PostalCode : 33308\r\n\r\nArt Womack recommends Steve Paul Dentist on Commercial Blvd area.\r\nA_womack@me.com>\r\nBond? Crowns? Veneer?\r\n\r\n\r\n'
data = mystr.split('\r\n')
data_filtered = list(filter(lambda x: x, data))
data_filtered_2 = list((map(lambda x: convert(x), data_filtered)))
data_combined = []
for i in data_filtered_2:
data_combined += i
for d in data_combined:
print(d.strip())
您可以尝试:
>>> from io import StringIO
>>> import pandas as pd
>>> data = """
... '\r\nContact Imported:\r\nBusinessPhone : 9547711900 Line1 : 2440
... East Commercial Blvd.\r\n City : Ft. Lauderdale\r\n State : FL\r\n PostalCode : 33308\r\n\r\nArt Womack recommends Steve Paul Dentist on Commercial Blvd area.\r\nA_womack@me.com>\r\nBond? Crowns? Veneer?\r\n\r\n\r\n'
... """
您可以尝试使用pd读取。读取\u csv
:
>>> df = pd.read_csv(StringIO(data))
>>> df
'
0 Contact Imported:
1 BusinessPhone : 9547711900 Line1 : 2440
2 East Commercial Blvd.
3 City : Ft. Lauderdale
4 State : FL
5 PostalCode : 33308
6 Art Womack recommends Steve Paul Dentist on Co...
7 A_womack@me.com>
8 Bond? Crowns? Veneer?
9 '
根据@jezrael的建议,如有必要,将df转换为列表:
# df.values.tolist()
或
BusinessPhone和Line1条目之间是否真的没有
\r\n
,从而使其与示例数据中的所有其他行不同?@ShawnMehan Yes.“Line 1:2440 East Commercial Blvd”应该是单个元素。稍后我会这样做,我可以将列表转换为字典,然后转换为pd.Series,这样我就可以将更新方法执行回原始df。在这个数据集中,不能使用空格作为分隔符拆分字符串,否则它会弄乱其他元素。您需要对数据进行更多的探索,并提出解决方案。一个这样的解决方案是,如果您知道字典的键,那么您可以使用它们对给定字符串执行更具体的拆分。如果需要,最后一次转换为列表:)问题是第1行:yada-yada应该有自己的记录这是我关于它与所有其他行不同的观点。根据定义,您需要以与其他组件不同的方式来处理它。我可以制作一些东西,但请你先确认所有的记录都遵循基本的结构模式好吗?或者你可以采取这些有效的解决方案,然后分割第二行。。。
>>> df.values
array([['Contact Imported:'],
['BusinessPhone : 9547711900 Line1 : 2440'],
['East Commercial Blvd.'],
[' City : Ft. Lauderdale'],
[' State : FL'],
[' PostalCode : 33308'],
['Art Womack recommends Steve Paul Dentist on Commercial Blvd area.'],
['A_womack@me.com>'],
['Bond? Crowns? Veneer?'],
["'"]], dtype=object)