2017-04-11 72 views
0

我正在嘗試創建一個系統,它將採用名稱作爲輸入的多行字符串,並將行輸出爲加入名字和姓氏的2d列表。我的問題是,名字和姓氏以及名字都可以作爲輸入。這可能會令人困惑,所以我在下面有一個例子。在列表中添加兩個字符串

這是在Python 3.6中。

我有名字的列表:

Bob 
Steve 
Ted 
Blake 
Harry 
Edric 
Tommy 
Bartholomew 

和姓氏列表:

Fischer 
Stinson 
McCord 
Bone 
Harvey 

輸入

"""Bob Fischer Steve Ted Stinson Blake Harry McCord 
Edric Bone Tommy Harvey Bartholomew""" 

輸出

[["Bob Fischer","Steve","Ted Stinson","Blake","Harry McCord"], 
["Edric Bone","Tommy Harvey","Bartholomew"]] 

我真的被困在區分名稱集合(Steve Ted)和第一個姓氏之間的空格。

任何人都可以幫忙嗎?我真的被卡住了...

+0

如果什麼firstnames和lastnames重疊?名字和姓氏都是單個單詞嗎? –

+0

@WillemVanOnsem他們保證永遠不會重疊。 –

+0

名稱或姓氏本身是否可以包含空格? – Adirio

回答

1

你似乎想匹配一個名字,可選地跟在空白和姓氏後面。

從名稱列出你有可能會創建一個單一的正則表達式,並使用re.findall找到所有非重疊的實例:

import re 
first = ['Bob','Steve','Ted','Blake','Harry','Edric','Tommy','Bartholomew'] 
surnames = ['Fischer','Stinson','McCord','Bone','Harvey'] 
r = r"\b(?:{})\b(?:\s+(?:{})\b)?".format("|".join(first),"|".join(surnames)) 
s = """Bob Fischer Steve Ted Stinson Blake Harry McCord 
Edric Bone Tommy Harvey Bartholomew""" 
print(re.findall(r, s)) 
# => ['Bob Fischer', 'Steve', 'Ted Stinson', 'Blake', 'Harry McCord', 'Edric Bone', 'Tommy Harvey', 'Bartholomew'] 

Python demo

regex that is generated with this code

\b(?:Bob|Steve|Ted|Blake|Harry|Edric|Tommy|Bartholomew)\b(?:\s+(?:Fischer|Stinson|McCord|Bone|Harvey)\b)? 

基本上,\b(?:...)\b(?:\s+(?:...)\b)?與替代品中的第一個名字匹配,作爲整個w的ORD(由於\b圍繞第一(?:...)分組構建體),然後(?:\s+(?:...)\b)?比賽1或1+空格(\s+)0次出現(由於?量詞),接着與任何姓氏(再次,因爲由於整個字尾隨\b)。

+0

引用Jamie Zawinski:「有些人遇到問題時,會想」我知道,我會用正則表達式「。現在他們有兩個問題。「 –

+1

@SembeiNorimaki:那些人不知道如何使用正則表達式 –

+0

有沒有一種方法來適應包括數字以及姓或名? –

0

試試這個,我用(而不是姓氏和名字)一個名詞和它們所屬的類別。

A = [ 'Beaver' , 'Strawberry'] 
B = [ 'Animal' , 'Fruit'] 

input_string = 'Beaver Animal Strawberry Strawberry Fruit' 
input_string = input_string.split(' ') 

def combinestring(x_string): 
    compiling_string = [] 

    for i,x in enumerate(x_string): 

     if (i+1) < len(x_string): 
      if x in A and x_string[i+1] in B: 
       compiling_string.append(x + ' ' + x_string[i+1]) 
      elif x in A: 
       compiling_string.append(x) 

     elif (i+1) == len(x_string) and x in A: 
      compiling_string.append(x) 

    return compiling_string 



print combinestring(input_string) 
#>>> ['Beaver Animal','Strawberry','Strawberry Fruit'] 
0
In [21]: first_names 
Out[21]: ['Bob', 'Steve', 'Ted', 'Blake', 'Harry', 'Edric', 'Tommy', 'Bartholomew'] 

In [22]: surnames 
Out[22]: ['Fischer', 'Stinson', 'McCord', 'Bone', 'Harvey'] 

In [23]: inp = """Bob Fischer Steve Ted Stinson Blake Harry McCord 
    ...: Edric Bone Tommy Harvey Bartholomew""".split() 

In [24]: out = [] 
    ...: fullname = None 
    ...: for name in inp: 
    ...:  if name in first_names: 
    ...:   if fullname: 
    ...:    out.append(fullname) 
    ...:   fullname = name 
    ...:  elif name in surnames: 
    ...:   fullname += ' ' + name 
    ...: out.append(fullname) 
    ...: 

In [25]: out 
Out[25]: 
['Bob Fischer', 
'Steve', 
'Ted Stinson', 
'Blake', 
'Harry McCord', 
'Edric Bone', 
'Tommy Harvey', 
'Bartholomew'] 
相關問題