将作者字符串划分为作者

时间:2015-08-21 15:13:24

标签: python parsing tokenize

我试图设计一种聪明的方法来划分一串作者,问题是该字符串不仅使用逗号来表示作者之间的划分,而且还使用逗号来区分他们的名字和姓氏。所以一个例子是:

"LastName1, F.N., LastName2, S.N, Lastname3, T."

我可以使用一些tokenize函数将字符串除以标记然后加入它们,但我不认为这是强大的:

def tokenize(str, token=','):
  return [x for x in re.split(r'\s*%s\s*' % token,str) if x]

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return itertools.zip_longest(*args, fillvalue=fillvalue)

auth = "LastName1, F.N., LastName2, S.N, Lastname3, T."
tmp1 = tokenize(auth)
tmp2 = grouper(tmp1, 2)
print(["{} {}".format(*i) for i in tmp2]) 

运行此代码将返回:

['LastName1 F.N.', 'LastName2 S.N', 'Lastname3 T.']

有更好(更强大)的方法吗?

2 个答案:

答案 0 :(得分:0)

这是一个真正的简单的标记化器,专门为逗号编写,(所以很清楚它在做什么):

def tokenize(str):
    return re.findall(r'([^,]*,[^,]*),?', str)

它查找字符串,逗号,字符串,带可选的尾部逗号,返回所有匹配项。

答案 1 :(得分:0)

这样做你想要的吗?

>>> auth = 'LastName1, F.N., LastName2, S.N, Lastname3, T.'
>>> names = tuple(map(str.strip, auth.split(',')))
>>> assert not len(names) & 1, 'names must come in pairs'
>>> data = [names[offset:offset+2][::-1] for offset in range(0, len(names), 2)]
>>> print(data)
[('F.N.', 'LastName1'), ('S.N', 'LastName2'), ('T.', 'Lastname3')]

它提供了一对包含名字和姓氏的列表。

修改

以下是根据您的评论进行的更正。

>>> auth = 'LastName1, F.N., LastName2, S.N, Lastname3, T.'
>>> names = tuple(map(str.strip, auth.split(',')))
>>> assert not len(names) & 1, 'names must come in pairs'
>>> data = [' '.join(names[index:index+2]) for index in range(0, len(names), 2)]
>>> print(data)
['LastName1 F.N.', 'LastName2 S.N', 'Lastname3 T.']

现在输出与您想要的完全相同。