如何使用Python在字符串中匹配子字符串

4

我有一个子字符串列表,需要循环匹配字符串;如果匹配成功,则执行所需功能。

问题在于,每当我尝试使用循环访问列表时,它就无法正常工作。否则,如果我将其硬编码,则可以正常工作。我不明白为什么会这样?

我的代码在此:

players_list = ['Circket', 'PSL', 'IPL', 't20', 'shahid afridi', 'aamer yamin']
length = len(players_list)
cur.execute("SELECT tweet FROM tweets_data")  # Query for getting specific attribute
length = len(players_list)
for row in cur.fetchall():
    i = 0
    while (i<length):
        #print players_list[i], 'tweet value', row
        if players_list[i] in row:
            print 'list item:', players_list[i]
            print row
        else:
            print 'Else statement.'
        i+=1

输出:仅显示与任何子串值匹配的行,例如:

子串为: 板球
: 担心安全官员关于以激进分子命名的板球


3
“it does not work” 并不是非常具体的问题描述。请更详细地描述实际的问题是什么。期望输出和实际输出有什么差别? - John Coleman
Players_list[i] 在行中只匹配完全相同的项目。尝试打印行,看看里面有什么? - DisappointedByUnaccountableMod
@IronFist 只是猜测,我认为 OP 想要进行不区分大小写的搜索,但却在进行区分大小写的搜索。他们似乎将其描述为循环失败,但循环的语法看起来很好(除非我漏掉了什么),所以我不认为这是问题所在。 - John Coleman
@IronFist 没有回溯错误/消息。每次执行else语句。 - SmartF
1
“Circket”与“cricket”不匹配。 - PM 2Ring
显示剩余4条评论
2个回答

1
你似乎在单词“Circket”中出现了拼写错误。此外,没有必要使用索引——直接循环遍历players_list,确保球员和行都有可预测的大小写。类似这样的代码:
players_list=['Cricket','PSL','IPL','t20','shahid afridi','aamer yamin']

cur.execute("SELECT tweet FROM tweets_data")  # Query for getting specific attribute
for row in cur.fetchall():
    for player in players_list: 
        if player.lower() in row.lower():
            print 'list item:', player
            print row
        else:
            print 'Else statement.'

在循环之前将“players_list”中的字符串转换为小写会更有效率。 - PM 2Ring
1
在找到匹配项后,你可以使用break语句跳出内部循环,因为问题要求至少有一个匹配项即可。否则,同一行将会被打印多次,每次都是与单词匹配的情况。 - Rahul
@PM2Ring 在某些方面无疑是正确的,尽管原始案例可能对某些目的很重要。可以创建一个小写的列表副本,并且可能转换为集合,以便使用set(row.lower().split())进行集合交集替换内部循环。我猜测问题规模太小,这些事情并不重要。 - John Coleman
说得好。在这个阶段,最简单的代码可能是为OP服务的最佳选择。 - PM 2Ring
@Rahul 不错的观点,尽管问题本身似乎有些模糊,不太清楚预期输出应该是什么。 - John Coleman

-1

如果我正确理解了你的问题,你可以尝试这个:

players_list = ['Cricket', 'PSL', 'IPL', 't20', 'shahid afridi', 'aamer yamin']
cur.execute("SELECT tweet FROM tweets_data")
for row in cur.fetchall():
    if any(True for p in players_list if p.lower() in row.lower()):
        print(row)
    else:
        print ("Else statement")

谢谢,你解决了我的问题。有一件事,我必须在每次迭代中使用player_list值,例如,我必须打印玩家姓名以及行号。例如,我这样做:print(p,':',row),但是出现错误:p未定义。请问有什么建议吗? - SmartF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接