我有一个字符串变量,它是一个人的第一个和中间名,它们被意外连接起来。我们称之为firstMiddle="johnadam"
我需要确定名字和名字是什么,然后将它们分成不同的变量。所以我有这个带有名字的大文本文件,我的想法是你检查完整的firstMiddle
字符串以查看它是否在列表中,如果不是,那么你减少一个字符然后重试。 (如果你增加失败,例如来自"max"
的{{1}})
我试过写了一百种不同的方法,而我的问题似乎是我无法用一整个词来表达x(这个\ b正则表达式的东西只适用于实际字符串而不是字符串变量?)。我将"maxinea"
减少到"johnadam"
的最佳结果是因为列表中有一个名称"johna"
。现在我甚至不记得我是如何做到这一点的,我的当前代码只减少了一次,然后在"johnathan"
中退出nameToMatch
。
我是一个总菜鸟。我知道我做的事情显然很愚蠢。请帮忙。这是一些代码:
nameList == False
答案 0 :(得分:2)
firstMiddle = "johnadam"
nameToCheck = firstMiddle
nameList = ['johnathan', 'john', 'kate', 'sam']
while nameToCheck not in nameList:
nameToCheck = nameToCheck[:-1]
firstname = nameToCheck
middleName = firstMiddle[ len(firstName): ]
答案 1 :(得分:0)
这是加布里埃尔所做的一个简单的改变。这个概念基本相同。这只是看最长的比赛,而不是第一场比赛。很难将整个代码放在评论部分,以便单独回答。
firstMiddle = "johnadam"
nameToCheck = firstMiddle
nameList = ['johnathan', 'john', 'kate', 'sam']
firstNames = filter(lambda m: firstMiddle.startswith(m), nameList)
middleName = ''
if firstNames: # if the list isnt empty
firstName = sorted( firstNames, key=len )[-1]
middleName = firstMiddle.partition(firstName)[2]
else:
firstName = firstMiddle
print firstName
看看这是否有效......
答案 2 :(得分:0)
你可以用蛮力的方式做到这一点。
迭代混合名称并每次更新它。
所以你得到了
['johnadam']
['johnada','m']
['johnad','am']
['johna','dam']
['john','adam'] # your names in the list
如果其中一个匹配你就把它们放在一边并继续这样做,直到它们都匹配为止。
如果你的名字开头相同,那么约翰'和' johnathan'或者是其他名字的中间名,比如“natham'和' johnathan'你不应该在找到匹配时停下来,但继续做切片,所以你得到[' john ',' athan']和[&# 39; joh',' nathan ']
mixnames = ['johnadam','johnathan','johnamax']
names = ['john','adam', 'johnathan','nathan','max']
foundnames = []
for name in mixnames:
for i in xrange(len(name)):
name1 = name[0:i+1]
name2 = name[i:]
if name1 in names and name1 not in foundnames:
foundnames.append(name1)
if name2 in names and name2 not in foundnames:
foundnames.append(name2)
print foundnames
输出:
['john', 'adam', 'johnathan', 'nathan', 'max']