我有一个包含足球队名字的数据库(例如在下面的第一个条目中,Marshall和Southern Methodist)。然后,与我的数据库名称匹配的是一些不同但可识别的名称(在下面的第一个条目中,SMU,Marshall):
[u'Houston', u'Alabama']
[u'Houst', u'Alab']
[u'Florida State', u'North Carolina State']
[u'NCSt', u'FlaSt']
[u'Penn State', u'Iowa']
[u'PnSt', u'Iowa']
[u'Oklahoma', u'Texas']
[u'Texas', u'Okla']
[u'Florida Atlantic', u'South Florida']
[u'SFla', u'FlAtl']
[u'Georgia', u'Tennessee']
[u'Geo', u'Tenn']
[u'San Jose State', u'Idaho']
[u'UI', u'SJSU']
[u'Washington State', u'Arizona State']
[u'ArzSt', u'WshSt']
[u'Fresno State', u'Nevada']
[u'Nevad', u'FrsSt']
[u'Oregon State', u'Arizona']
[u'ARIZ', u'OSU']
[u'Clemson', u'Virginia Tech']
[u'VTech', u'Clem']
[u'Chattanooga', u'Arkansas']
[u'UTC', u'AR']
[u'USC', u'Stanford']
[u'USC', u'Stanf']
[u'Baylor', u'Colorado']
[u'BU', u'CU']
[u'North Texas', u'Louisiana-Lafayette']
[u'NoTex', u'LaLaf']
[u'Tulane', u'Army']
[u'TLN', u'ARMY']
[u'Troy', u'Florida International']
[u'TROY', u'FIU']
[u'Louisiana-Monroe', u'Arkansas State']
[u'ASU', u'ULM']
[u'Texas Tech', u'Iowa State']
[u'TT', u'ISU']
[u'Akron', u'Western Michigan']
[u'AKRON', u'WMU']
[u'Liberty', u'Toledo']
[u'LIBERTY', u'TOLEDO']
[u'Virginia', u'Middle Tennessee']
[u'Virg', u'MTnSt']
[u'Oklahoma State', u'Texas A&M']
[u'TexAM', u'OKSt']
[u'Notre Dame', u'UCLA']
[u'NDame', u'UCLA']
[u'Rutgers', u'Cincinnati']
[u'Cincy', u'Rutgr']
[u'Ohio State', u'Purdue']
[u'Prdue', u'OhSt']
[u'LSU', u'Florida']
[u'Fla', u'LSU']
[u'Air Force', u'UNLV']
[u'AFA', u'UNLV']
[u'Nebraska', u'Missouri']
[u'Misso', u'Neb']
[u'New Mexico State', u'Boise State']
[u'NMxSt', u'BoiSt']
[u'Pittsburgh', u'Navy']
[u'Navy', u'Pitt']
[u'Wake Forest', u'Florida State']
[u'WFrst', u'FlaSt']
[u'San Jose State', u'Hawaii']
[u'Hawa', u'SJSt']
[u'UCF', u'South Florida']
[u'UCF', u'SFla']
对于每个包含四个名称的组,我需要将我的数据库名称与正确的新名称相匹配。我现在可以使用很多if语句来做到这一点,但它需要很多代码,而且不会特别优雅。有更好的方法来匹配吗?
答案 0 :(得分:1)
如果没有抓住TBH的所有内容,这是不可能的,除非你有一些指示声明部分的指标。例如。
如果
Kentucky Mississippi State
MS UK
表示如下
[Kentucky Mississippi State]
[MS] [UK]
分手和解析会很容易。
^\[([a-zA-Z,\s]*)\](?:\n)\[([a-zA-Z,\s]*)\]
编辑:
只需阅读您的最新数据。
^\[u\'([a-zA-Z,\s]*)\',\su\'([a-zA-Z,\s]*)'\]\n\[u\'([a-zA-Z,\s]*)\',\su\'([a-zA-Z,\s]*)\'\]$
捕获组中捕获了所有内容:)
答案 1 :(得分:1)
from difflib import SequenceMatcher
li = [\
([u'Houston', u'Alabama'],
[u'Houst', u'Alab']),
([u'Florida State', u'North Carolina State'],
[u'NCSt', u'FlaSt']),
([u'Penn State', u'Iowa'],
[u'PnSt', u'Iowa']),
([u'Oklahoma', u'Texas'],
[u'Texas', u'Okla']),
([u'Florida Atlantic', u'South Florida'],
[u'SFla', u'FlAtl']),
([u'Georgia', u'Tennessee'],
[u'Geo', u'Tenn']),
([u'San Jose State', u'Idaho'],
[u'UI', u'SJSU']),
([u'Washington State', u'Arizona State'],
[u'ArzSt', u'WshSt']),
([u'Fresno State', u'Nevada'],
[u'Nevad', u'FrsSt']),
([u'Oregon State', u'Arizona'],
[u'ARIZ', u'OSU']),
([u'Clemson', u'Virginia Tech'],
[u'VTech', u'Clem']),
([u'Chattanooga', u'Arkansas'],
[u'UTC', u'AR']),
([u'USC', u'Stanford'],
[u'USC', u'Stanf']),
([u'Baylor', u'Colorado'],
[u'BU', u'CU']),
([u'North Texas', u'Louisiana-Lafayette'],
[u'NoTex', u'LaLaf']),
([u'Tulane', u'Army'],
[u'TLN', u'ARMY']),
([u'Troy', u'Florida International'],
[u'TROY', u'FIU']),
([u'Louisiana-Monroe', u'Arkansas State'],
[u'ASU', u'ULM']),
([u'Texas Tech', u'Iowa State'],
[u'TT', u'ISU']),
([u'Akron', u'Western Michigan'],
[u'AKRON', u'WMU']),
([u'Liberty', u'Toledo'],
[u'LIBERTY', u'TOLEDO']),
([u'Virginia', u'Middle Tennessee'],
[u'Virg', u'MTnSt']),
([u'Oklahoma State', u'Texas A&M'],
[u'TexAM', u'OKSt']),
([u'Notre Dame', u'UCLA'],
[u'NDame', u'UCLA']),
([u'Rutgers', u'Cincinnati'],
[u'Cincy', u'Rutgr']),
([u'Ohio State', u'Purdue'],
[u'Prdue', u'OhSt']),
([u'LSU', u'Florida'],
[u'Fla', u'LSU']),
([u'Air Force', u'UNLV'],
[u'AFA', u'UNLV']),
([u'Nebraska', u'Missouri'],
[u'Misso', u'Neb']),
([u'New Mexico State', u'Boise State'],
[u'NMxSt', u'BoiSt']),
([u'Pittsburgh', u'Navy'],
[u'Navy', u'Pitt']),
([u'Wake Forest', u'Florida State'],
[u'WFrst', u'FlaSt']),
([u'San Jose State', u'Hawaii'],
[u'Hawa', u'SJSt']),
([u'UCF', u'South Florida'],
[u'UCF', u'SFla']) ]
def comp(N,D,sq = SequenceMatcher(None)):
sq.set_seqs(N[0],D[0])
a = sq.ratio()
sq.set_seqs(N[1],D[1])
b = sq.ratio()
sq.set_seqs(N[0],D[1])
x = sq.ratio()
sq.set_seqs(N[1],D[0])
y = sq.ratio()
if a>x and b>y:
return (N[0],D[0]), (N[1],D[1])
else:
return (N[0],D[1]),(N[1],D[0])
print '\n'.join('%-30s %s' % comp(N,D) for N,D in li)
结果
(u'Houston', u'Houst') (u'Alabama', u'Alab')
(u'Florida State', u'FlaSt') (u'North Carolina State', u'NCSt')
(u'Penn State', u'PnSt') (u'Iowa', u'Iowa')
(u'Oklahoma', u'Okla') (u'Texas', u'Texas')
(u'Florida Atlantic', u'FlAtl') (u'South Florida', u'SFla')
(u'Georgia', u'Geo') (u'Tennessee', u'Tenn')
(u'San Jose State', u'SJSU') (u'Idaho', u'UI')
(u'Washington State', u'WshSt') (u'Arizona State', u'ArzSt')
(u'Fresno State', u'FrsSt') (u'Nevada', u'Nevad')
(u'Oregon State', u'OSU') (u'Arizona', u'ARIZ')
(u'Clemson', u'Clem') (u'Virginia Tech', u'VTech')
(u'Chattanooga', u'UTC') (u'Arkansas', u'AR')
(u'USC', u'USC') (u'Stanford', u'Stanf')
(u'Baylor', u'BU') (u'Colorado', u'CU')
(u'North Texas', u'NoTex') (u'Louisiana-Lafayette', u'LaLaf')
(u'Tulane', u'TLN') (u'Army', u'ARMY')
(u'Troy', u'TROY') (u'Florida International', u'FIU')
(u'Louisiana-Monroe', u'ULM') (u'Arkansas State', u'ASU')
(u'Texas Tech', u'TT') (u'Iowa State', u'ISU')
(u'Akron', u'AKRON') (u'Western Michigan', u'WMU')
(u'Liberty', u'TOLEDO') (u'Toledo', u'LIBERTY')
(u'Virginia', u'Virg') (u'Middle Tennessee', u'MTnSt')
(u'Oklahoma State', u'OKSt') (u'Texas A&M', u'TexAM')
(u'Notre Dame', u'NDame') (u'UCLA', u'UCLA')
(u'Rutgers', u'Rutgr') (u'Cincinnati', u'Cincy')
(u'Ohio State', u'OhSt') (u'Purdue', u'Prdue')
(u'LSU', u'LSU') (u'Florida', u'Fla')
(u'Air Force', u'AFA') (u'UNLV', u'UNLV')
(u'Nebraska', u'Neb') (u'Missouri', u'Misso')
(u'New Mexico State', u'NMxSt') (u'Boise State', u'BoiSt')
(u'Pittsburgh', u'Pitt') (u'Navy', u'Navy')
(u'Wake Forest', u'WFrst') (u'Florida State', u'FlaSt')
(u'San Jose State', u'SJSt') (u'Hawaii', u'Hawa')
(u'UCF', u'UCF') (u'South Florida', u'SFla')
from difflib import SequenceMatcher
li = [\
([u'Liberty', u'Toledo'], #######
[u'LIBERTY', u'TOLEDO']),
([u'Chattanooga', u'Arkansas'], ################
[u'UTC', u'AR']),
([u'Texas Tech', u'Iowa State'], ###########
[u'TT', u'ISU']) ]
def comp(N,D,sq = SequenceMatcher(None)):
sq.set_seqs(N[0],D[0])
a = sq.ratio()
sq.set_seqs(N[1],D[1])
b = sq.ratio()
sq.set_seqs(N[0],D[1])
x = sq.ratio()
sq.set_seqs(N[1],D[0])
y = sq.ratio()
sq.set_seqs(N[0].lower(),D[0].lower())
al = sq.ratio()
sq.set_seqs(N[1].lower(),D[1].lower())
bl = sq.ratio()
sq.set_seqs(N[0].lower(),D[1].lower())
xl = sq.ratio()
sq.set_seqs(N[1].lower(),D[0].lower())
yl = sq.ratio()
return ((N[0],D[0]), (N[1],D[1]),
a,b,a*b,a+b,
(N[0].lower(),D[0].lower()), (N[1].lower(),D[1].lower()),
al,bl,al*bl,al+bl,
(N[0],D[1]),(N[1],D[0]),
x,y,x*y,x+y,
(N[0].lower(),D[1].lower()),(N[1].lower(),D[0].lower()),
xl,yl,xl*yl,xl+yl)
print '\n'.join(('====='*14)+ '\n'
'%-25s %s\n'
' %-10f %f --> x%f +%f\n'
'%-25s %s\n'
' %-10f %f --> x%f +%f\n\n'
'%-25s %s\n'
' %-10f %f --> x%f +%f\n'
'%-25s %s\n'
' %-10f %f --> x%f +%f\n'
% comp(N,D) for N,D in li)
结果
======================================================================
(u'Liberty', u'LIBERTY') (u'Toledo', u'TOLEDO')
0.142857 0.166667 --> x0.023810 +0.309524
(u'liberty', u'liberty') (u'toledo', u'toledo')
1.000000 1.000000 --> x1.000000 +2.000000
(u'Liberty', u'TOLEDO') (u'Toledo', u'LIBERTY')
0.153846 0.153846 --> x0.023669 +0.307692
(u'liberty', u'toledo') (u'toledo', u'liberty')
0.307692 0.153846 --> x0.047337 +0.461538
======================================================================
(u'Chattanooga', u'UTC') (u'Arkansas', u'AR')
0.142857 0.200000 --> x0.028571 +0.342857
(u'chattanooga', u'utc') (u'arkansas', u'ar')
0.142857 0.400000 --> x0.057143 +0.542857
(u'Chattanooga', u'AR') (u'Arkansas', u'UTC')
0.000000 0.000000 --> x0.000000 +0.000000
(u'chattanooga', u'ar') (u'arkansas', u'utc')
0.153846 0.000000 --> x0.000000 +0.153846
======================================================================
(u'Texas Tech', u'TT') (u'Iowa State', u'ISU')
0.333333 0.307692 --> x0.102564 +0.641026
(u'texas tech', u'tt') (u'iowa state', u'isu')
0.333333 0.307692 --> x0.102564 +0.641026
(u'Texas Tech', u'ISU') (u'Iowa State', u'TT')
0.000000 0.000000 --> x0.000000 +0.000000
(u'texas tech', u'isu') (u'iowa state', u'tt')
0.153846 0.333333 --> x0.051282 +0.487179
以上代码结果显示:
1 /
关联(u'Liberty', u'LIBERTY')
的比率a = 0.142857不如关联(u'Liberty', u'TOLEDO')
的比率x = 0.153846!
这足以使条件a>x and b>y
评估为False,并导致作为结果的一部分返回的关联(u'Liberty', u'TOLEDO')
,而它是不期望的关联,
此外,关联(u'Toledo', u'TOLEDO')
和(u'Toledo', u'LIBERTY')
的比率正确地描述了第一个(u'Toledo', u'TOLEDO')
是期望的关联。
当lower()
方法应用于字符串时,它显然解决了这个缺陷,因为关联(u'liberty', u'liberty')
和(u'toledo', u'toledo')
现在的比率为1.000000
2 /
然而,lower()
的干预引发了其他两个以前正确的案例的缺陷。
没有lower()
,
不正确的关联(u'Chattanooga', u'AR')
和(u'Arkansas', u'UTC')
的比率为0.000000
然后,胜利协会(u'Chattanooga', u'UTC') (u'Arkansas', u'AR')
是正确的结果。
lower()
,
降低的正确(u'chattanooga', u'utc')
具有与未降低版本相同的比率0.142857,
但与现在估价为0.153846的不正确(u'chattanooga', u'ar')
相比,
碰巧正确(u'chattanooga', u'utc')
不如不正确(u'chattanooga', u'ar')
因此,条件被评估为False,然后返回关联(u'Chattanooga', u'AR') (u'Arkansas', u'UTC')
,而不正确。
。
与错误的关联(u'Texas Tech', u'ISU') (u'Iowa State', u'TT')
完全相同,其中比率0.000000低于比率0.333333和0.307692的正确关联(u'Texas Tech', u'TT') (u'Iowa State', u'ISU')
降低时,
(u'iowa state', u'tt')
的比率从0.000000增加到0.333333,而另一个关联(u'iowa state', u'isu')
保持相同的较低比率0.307692。
因此,条件再次评估为False。
3 /
很明显,新的缺陷是由于标签u'AR'
和u'TT'
非常短暂。只有一两个降低的字母与较长的降低名称'chattanooga'
和u'texas tech'
匹配,而这些字符串的未降低版本之间没有匹配,并且情况会下降。
很明显,问题出现了,因为我的布尔表达式a>x and b>y
分别为两个表达式a>x
和b>y
中的每一个赋予了很多权重。
我认为必须找到一个结合a>x
的结果和b>y
的结果的条件
将它们相乘并不会让我觉得这是一种好方法
在下面的代码中,我选择添加比率并执行不止一个条件评估。
from difflib import SequenceMatcher
li = [\
([u'Houston', u'Alabama'],
[u'Houst', u'Alab']),
([u'Florida State', u'North Carolina State'],
[u'NCSt', u'FlaSt']),
([u'Penn State', u'Iowa'],
[u'PnSt', u'Iowa']),
([u'Oklahoma', u'Texas'],
[u'Texas', u'Okla']),
([u'Florida Atlantic', u'South Florida'],
[u'SFla', u'FlAtl']),
([u'Georgia', u'Tennessee'],
[u'Geo', u'Tenn']),
([u'San Jose State', u'Idaho'],
[u'UI', u'SJSU']),
([u'Washington State', u'Arizona State'],
[u'ArzSt', u'WshSt']),
([u'Fresno State', u'Nevada'],
[u'Nevad', u'FrsSt']),
([u'Oregon State', u'Arizona'],
[u'ARIZ', u'OSU']),
([u'Clemson', u'Virginia Tech'],
[u'VTech', u'Clem']),
([u'Chattanooga', u'Arkansas'],
[u'UTC', u'AR']),
([u'USC', u'Stanford'],
[u'USC', u'Stanf']),
([u'Baylor', u'Colorado'],
[u'BU', u'CU']),
([u'North Texas', u'Louisiana-Lafayette'],
[u'NoTex', u'LaLaf']),
([u'Tulane', u'Army'],
[u'TLN', u'ARMY']),
([u'Troy', u'Florida International'],
[u'TROY', u'FIU']),
([u'Louisiana-Monroe', u'Arkansas State'],
[u'ASU', u'ULM']),
([u'Texas Tech', u'Iowa State'],
[u'TT', u'ISU']),
([u'Akron', u'Western Michigan'],
[u'AKRON', u'WMU']),
([u'Liberty', u'Toledo'],
[u'LIBERTY', u'TOLEDO']),
([u'Virginia', u'Middle Tennessee'],
[u'Virg', u'MTnSt']),
([u'Oklahoma State', u'Texas A&M'],
[u'TexAM', u'OKSt']),
([u'Notre Dame', u'UCLA'],
[u'NDame', u'UCLA']),
([u'Rutgers', u'Cincinnati'],
[u'Cincy', u'Rutgr']),
([u'Ohio State', u'Purdue'],
[u'Prdue', u'OhSt']),
([u'LSU', u'Florida'],
[u'Fla', u'LSU']),
([u'Air Force', u'UNLV'],
[u'AFA', u'UNLV']),
([u'Nebraska', u'Missouri'],
[u'Misso', u'Neb']),
([u'New Mexico State', u'Boise State'],
[u'NMxSt', u'BoiSt']),
([u'Pittsburgh', u'Navy'],
[u'Navy', u'Pitt']),
([u'Wake Forest', u'Florida State'],
[u'WFrst', u'FlaSt']),
([u'San Jose State', u'Hawaii'],
[u'Hawa', u'SJSt']),
([u'UCF', u'South Florida'],
[u'UCF', u'SFla']) ]
def comp(N,D,sq = SequenceMatcher(None)):
sq.set_seqs(N[0],D[0])
a = sq.ratio()
sq.set_seqs(N[1],D[1])
b = sq.ratio()
sq.set_seqs(N[0],D[1])
x = sq.ratio()
sq.set_seqs(N[1],D[0])
y = sq.ratio()
sq.set_seqs(N[0].lower(),D[0].lower())
al = sq.ratio()
sq.set_seqs(N[1].lower(),D[1].lower())
bl = sq.ratio()
sq.set_seqs(N[0].lower(),D[1].lower())
xl = sq.ratio()
sq.set_seqs(N[1].lower(),D[0].lower())
yl = sq.ratio()
if ((a>0.5 and b>0.5 and a+b>1.4)
or (al>0.5 and bl>0.5 and al+bl>1.4)):
return (N[0],D[0]), (N[1],D[1])
elif ((x>0.4 and y>0.4 and x+y>1.4)
or (xl>0.4 and yl>0.4 and xl+yl>1.4)):
return (N[0],D[1]), (N[1],D[0])
elif x+y==0.0 and a+b>0.1:
return (N[0],D[0]), (N[1],D[1])
elif a+b==0.00 and x+y>0.1:
return (N[0],D[1]), (N[1],D[0])
elif a+b > x + y + 0.5:
return (N[0],D[0]), (N[1],D[1])
elif x+y > a + b + 0.5:
return (N[0],D[1]), (N[1],D[0])
elif a+b > x + y:
return (N[0],D[0]), (N[1],D[1])
elif x+y > a + b:
return (N[0],D[1]), (N[1],D[0])
print '\n'.join('%-30s %s' % comp(N,D) for N,D in li)
结果
(u'Houston', u'Houst') (u'Alabama', u'Alab')
(u'Florida State', u'FlaSt') (u'North Carolina State', u'NCSt')
(u'Penn State', u'PnSt') (u'Iowa', u'Iowa')
(u'Oklahoma', u'Okla') (u'Texas', u'Texas')
(u'Florida Atlantic', u'FlAtl') (u'South Florida', u'SFla')
(u'Georgia', u'Geo') (u'Tennessee', u'Tenn')
(u'San Jose State', u'SJSU') (u'Idaho', u'UI')
(u'Washington State', u'WshSt') (u'Arizona State', u'ArzSt')
(u'Fresno State', u'FrsSt') (u'Nevada', u'Nevad')
(u'Oregon State', u'OSU') (u'Arizona', u'ARIZ')
(u'Clemson', u'Clem') (u'Virginia Tech', u'VTech')
(u'Chattanooga', u'UTC') (u'Arkansas', u'AR')
(u'USC', u'USC') (u'Stanford', u'Stanf')
(u'Baylor', u'BU') (u'Colorado', u'CU')
(u'North Texas', u'NoTex') (u'Louisiana-Lafayette', u'LaLaf')
(u'Tulane', u'TLN') (u'Army', u'ARMY')
(u'Troy', u'TROY') (u'Florida International', u'FIU')
(u'Louisiana-Monroe', u'ULM') (u'Arkansas State', u'ASU')
(u'Texas Tech', u'TT') (u'Iowa State', u'ISU')
(u'Akron', u'AKRON') (u'Western Michigan', u'WMU')
(u'Liberty', u'LIBERTY') (u'Toledo', u'TOLEDO')
(u'Virginia', u'Virg') (u'Middle Tennessee', u'MTnSt')
(u'Oklahoma State', u'OKSt') (u'Texas A&M', u'TexAM')
(u'Notre Dame', u'NDame') (u'UCLA', u'UCLA')
(u'Rutgers', u'Rutgr') (u'Cincinnati', u'Cincy')
(u'Ohio State', u'OhSt') (u'Purdue', u'Prdue')
(u'LSU', u'LSU') (u'Florida', u'Fla')
(u'Air Force', u'AFA') (u'UNLV', u'UNLV')
(u'Nebraska', u'Neb') (u'Missouri', u'Misso')
(u'New Mexico State', u'NMxSt') (u'Boise State', u'BoiSt')
(u'Pittsburgh', u'Pitt') (u'Navy', u'Navy')
(u'Wake Forest', u'WFrst') (u'Florida State', u'FlaSt')
(u'San Jose State', u'SJSt') (u'Hawaii', u'Hawa')
(u'UCF', u'UCF') (u'South Florida', u'SFla')
所有结果似乎都是正确的
答案 2 :(得分:1)
模糊Wuzzy是一个非常酷的名称匹配工具。
以下是一个例子:
> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]
> process.extract("new york jets", choices, limit=2)
[('New York Jets', 100), ('New York Giants', 78)]
> process.extractOne("cowboys", choices)
("Dallas Cowboys", 90)