【问题标题】:How to match substring in a string using Python [duplicate]如何使用Python匹配字符串中的子字符串[重复]
【发布时间】:2016-10-12 22:57:53
【问题描述】:

我有一个子字符串列表,我必须在字符串中迭代匹配;如果匹配,则执行所需的功能。

问题是,每当我尝试使用循环访问列表时,它都不起作用。否则,如果我对其进行硬编码,则它可以工作。我不明白为什么会这样?

我的代码在这里:

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

输出:它应该只显示与任何子字符串值匹配的行,例如:

子字符串是:板球
:安全官员担心板球团队以武装分子的名字命名

【问题讨论】:

  • “它不起作用”信息量不是很大。请更详细地描述实际问题。预期输出与实际输出是多少?
  • Players_list[i] in row 仅匹配行中精确、完整、相同的项目。试试打印行,里面有什么?
  • 不妨发布 Traceback 消息。
  • @IronFist 代码看起来不错(即使有些不合 Python)。我认为这是 OP 期待一件事但得到另一件事的情况。
  • 'Circket' 匹配 'cricket'

标签: python list substring


【解决方案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 未定义。请问有什么建议吗?
【解决方案2】:

您似乎与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中的字符串转换为小写会更有效。
  • 你可以break在获得匹配后退出内循环,因为问题说至少一个匹配就足够了。否则,相同的row 将针对它匹配的每个单词打印。
  • @PM2Ring 这在某些方面无疑是正确的,尽管原始案例可能对某些目的很重要。可以创建列表的小写副本,并可能将其转换为集合,以便集合交集(针对set(row.lower().split()))可以替换内部循环。我的猜测是问题的规模太小,这些事情都无关紧要。
  • 公平点。在这个阶段,执行这项工作的最简单的代码可能最好地为 OP 提供服务。
  • @Rahul 好点子,虽然这个问题本身似乎有点模糊,关于预期的输出应该是什么。
猜你喜欢
  • 2021-08-25
  • 2020-08-24
  • 2019-06-26
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多