Python:从列表中拆分带分隔符的字符串

Python:从列表中拆分带分隔符的字符串,python,regex,string,split,Python,Regex,String,Split,我想拆分列表中带有分隔符的字符串。 字符串具有以下模式:Firstname,Lastname Email 分隔符列表中有以下内容:[',','] 我想拆分字符串以得到这样的列表 ['Firstname','Lastname','Email'] 为了更好地理解我的问题,我正努力实现以下目标: 用户应能够提供待导入数据的源模式:%Fn%,%Ln%%Mail% 以及如何显示数据的目标模式: %Ln%%Fn%; %Ln%, %Fn; %Mail% 这是我的尝试: data = "Firstname,

我想拆分列表中带有分隔符的字符串。

字符串具有以下模式:Firstname,Lastname Email

分隔符列表中有以下内容:[',',']

我想拆分字符串以得到这样的列表 ['Firstname','Lastname','Email']

为了更好地理解我的问题,我正努力实现以下目标:

用户应能够提供待导入数据的源模式:
%Fn%,%Ln%%Mail%
以及如何显示数据的目标模式:

%Ln%%Fn%; %Ln%, %Fn; %Mail%
这是我的尝试:

data = "Firstname, Lastname Email"

for delimiter in source_pattern_delimiter:
    prog = re.compile(delimiter)
    data_tuple = prog.split(data)
如何“合并”数据组列表


希望有帮助

看来你想要这样的东西

>> s = "Firstname, Lastname Email"
>>> delim = [', ',' ']
>>> re.split(r'(?:' + '|'.join(delim) + r')', s)
['Firstname', 'Lastname', 'Email']

不带正则表达式的解决方案,如果要在特定位置应用特定分隔符:

def split(s, delimiters):
    for d in delimiters:
        item, s = s.split(d, 1)
        yield item
    else:
        yield s

>>> list(split("Firstname, Lastname Email", [", ", " "]))
["Firstname", "Lastname", "Email"]

如何在空格上拆分,然后删除任何尾随逗号

>>> data = "Firstname, Lastname Email"
>>> [s.rstrip(',') for s in data.split(' ')]
['Firstname', 'Lastname', 'Email']

您需要一种基于模板的方法来重建分割数据。下面的脚本可以让您了解如何前进。它首先将
数据
分成三个部分,并将每个部分分配给一个字典条目。然后,可以使用该参数来确定目标模式:

import re

data = "Firstname, Lastname Email"

# Find a list of entries and display them
entries = re.findall("(\w+)", data)
print entries       

# Convert the entries into a dictionary
dEntries = {"Fn": entries[0], "Ln": entries[1], "Mail": entries[2]}

# Use dictionary-based string formatting to provide a template system
print "%(Ln)s%(Fn)s; %(Ln)s, %(Fn)s; %(Mail)s" % dEntries
LastnameFirstname; Lastname, Firstname; Email
这将显示以下内容:

['Firstname', 'Lastname', 'Email']
LastnameFirstname; Lastname, Firstname; Email
如果您确实需要使用您提供的确切模板系统,那么可以执行以下操作,首先将目标模式转换为适合Python字典系统使用的模式:

def display_with_template(data, target_pattern):
    entries = re.findall("(\w+)", data)
    dEntries = {"Fn": entries[0], "Ln": entries[1], "Mail": entries[2]}

    for item in ["Fn", "Ln", "Mail"]:
        target_pattern= target_pattern.replace("%%%s%%" % item, "%%(%s)s" % item)

    return target_pattern % dEntries

print display_with_template("Firstname, Lastname Email", r"%Ln%%Fn%; %Ln%, %Fn%; %Mail%")
将显示相同的结果,但使用自定义目标模式:

import re

data = "Firstname, Lastname Email"

# Find a list of entries and display them
entries = re.findall("(\w+)", data)
print entries       

# Convert the entries into a dictionary
dEntries = {"Fn": entries[0], "Ln": entries[1], "Mail": entries[2]}

# Use dictionary-based string formatting to provide a template system
print "%(Ln)s%(Fn)s; %(Ln)s, %(Fn)s; %(Mail)s" % dEntries
LastnameFirstname; Lastname, Firstname; Email

一种更稳健的方法是从源模式本身构建正则表达式,但我想对于这个应用程序,您不需要那么精确。在我看来,这是最正确的解决方案。正则表达式不处理诸如
“名字、姓氏电子邮件”
之类的情况。顺便说一句,不需要
for
循环的
else
子句。只要取消输入
yield s
语句。@HaiVu:谢谢您的感谢。我知道不需要
else
子句,我只是认为它适合这个用例。@user87690:感谢您的贡献。您是否有任何想法来处理名包含2个元素(因此有2个名)的数据。基本上说:如何处理与源模式不匹配的数据。示例数据:Murat Ugur,姓氏muratg@mail; 约翰,多伊John@mail用你的方法我得到:FN:Ugur,LN:Lastname,Mail:Muratmuratg@mail@MuratG:>>>列表(拆分(“Murat Ugur,姓氏muratg@mail.mail“,[”,“,”)[“Murat Ugur”,“Lastname”,“Lastname”muratg@mail.mail太好了!这很有效。我也会考虑USER 8690的建议,因为第一个名字可能是第一个名字,比如两个第一个名字。只是另外一个名字。如何获得大写的拆分元素?谢谢,Muratcan请您提供输入示例。此“Firstname,Lastname Email”变成具有上述表达式的['Firstname','Lastname',Email']。我需要['FIRSTNAME','LASTNAME',EMAIL']。请查看这是您需要的
re.split(r“\s(?=[A-Z]),“FIRSTNAME,LASTNAME EMAIL”)
输出是
['FIRSTNAME','LASTNAME','EMAIL']
。是的。我必须将其放入dict中,然后使用源模式创建目标模式。我使用这个表达式:
filtered\u text\u data\u in\u source\u pattern[key]=dict(zip(source\u pattern\u elements,text\u data\u element\u tuple))
。我想做的是:我有我的源模式[“LN”,“FN”,“MAIL”]我有我的源模式定界符[“,”,“,”]我把我的数据放进一个dict中,看起来像这样:{1:['LN':'G',FN':'Murat','MAIL':'muratg@mail.com']}我有我的目标模式[“Ln”,“Fn”,“Ln”,“Fn”,“Mail”]-->如果用户不想使用所有元素,这是为了灵活性。我有我的目标模式定界符[“”,“;”,“,”,“;”]现在如何将数据与定界符一起放入目标模式中?