Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:拆分一个字符串,在每个元素中保留相关信息_Python_Regex_Python 3.x_Pandas_Data Cleaning - Fatal编程技术网

Python:拆分一个字符串,在每个元素中保留相关信息

Python:拆分一个字符串,在每个元素中保留相关信息,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业务电话: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'

拆分之后,我的目标是创建一个包含相关数据的元素列表(大部分元素中间包含“:”),以便稍后将其转换为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)