在Python中查找字符串列表中包含表达式的子字符串
创建一个数组,如下所示在Python中查找字符串列表中包含表达式的子字符串,python,python-2.7,Python,Python 2.7,创建一个数组,如下所示 arrayy = ['top,tree,branch,bla-top,tree,ascb-red/blue', 'tree,leaves,mmn-tree,leaves,mscb-gra/gre', 'leaves,bird,responder,mon-leaves,bird,ascb-yoo/yee','tree,leaves,mount-road,cycle-roo/soo'] 有没有一种简单的方法可以找到在字符串列表中包含子字符串的索引 例如,我想搜索“leave
arrayy = ['top,tree,branch,bla-top,tree,ascb-red/blue', 'tree,leaves,mmn-tree,leaves,mscb-gra/gre', 'leaves,bird,responder,mon-leaves,bird,ascb-yoo/yee','tree,leaves,mount-road,cycle-roo/soo']
def find_index_sub_string(needle,haystack):
return [i for i, x in enumerate(haystack) if needle in x]
search_re = re.compile("leaves,bird.*-leaves,bird.*")
for i in range (len(arrayy)):
if re.match(search_re, arrayy[i]):
print i
大多数情况下,您希望在文本中找到(复杂)模式,正则表达式可以做到这一点:
import re
data = ['top,tree,branch,bla-top,tree,ascb-red/blue',
'tree,leaves,mmn-tree,leaves,mscb-gra/gre',
'leaves,bird,responder,mon-leaves,bird,ascb-yoo/yee',
'tree,leaves,mount-road,cycle-roo/soo']
patt1 = r"leaves,bird.*-leaves,bird"
patt2 = r"tree"
for patt in (patt1,patt2):
print (f"'{patt}' in text:") # py 3, for 2 use: print '{} in text:'.format(patt)
for idx,text in enumerate(data):
if re.search(patt,text): # modified from re.match wich only looks at start of text
print(idx, text) # py 3, for 2 use: print idx,text
输出:
'leaves,bird.*-leaves,bird' in text:
2 leaves,bird,responder,mon-leaves,bird,ascb-yoo/yee
'tree' in text:
1 tree,leaves,mmn-tree,leaves,mscb-gra/gre
3 tree,leaves,mount-road,cycle-roo/soo
你可以在线开发你的匹配模式,f.e.on-并让它向你解释它们
如果你想从regex开始,这是一个有趣的方式:(只是一个粉丝,不是附属的;o))-官方网站应该是
我的第二个模式不需要正则表达式-如果文本中的“树”是一个简单的
,
也会有同样的效果。大多数时候,你想在文本中找到(复杂的)模式,正则表达式可以做到:
import re
data = ['top,tree,branch,bla-top,tree,ascb-red/blue',
'tree,leaves,mmn-tree,leaves,mscb-gra/gre',
'leaves,bird,responder,mon-leaves,bird,ascb-yoo/yee',
'tree,leaves,mount-road,cycle-roo/soo']
patt1 = r"leaves,bird.*-leaves,bird"
patt2 = r"tree"
for patt in (patt1,patt2):
print (f"'{patt}' in text:") # py 3, for 2 use: print '{} in text:'.format(patt)
for idx,text in enumerate(data):
if re.search(patt,text): # modified from re.match wich only looks at start of text
print(idx, text) # py 3, for 2 use: print idx,text
输出:
'leaves,bird.*-leaves,bird' in text:
2 leaves,bird,responder,mon-leaves,bird,ascb-yoo/yee
'tree' in text:
1 tree,leaves,mmn-tree,leaves,mscb-gra/gre
3 tree,leaves,mount-road,cycle-roo/soo
你可以在线开发你的匹配模式,f.e.on-并让它向你解释它们
如果你想从regex开始,这是一个有趣的方式:(只是一个粉丝,不是附属的;o))-官方网站应该是
我的第二个模式不需要正则表达式-一个简单的
如果文本中的“tree:
也会有同样的效果。对于leaves,bird*-leaves,bird*
search,你需要使用search\re=re.compile(“leaves,bird.*-leaves,bird.*”)
在循环外,然后在循环内执行ifsearch\re.search()
。但是如果我进行搜索,那会返回所有索引吗?或者我需要循环获取索引吗?您仍然需要以类似的方式迭代@Patrick Artner的解决方案“leaves,bird*-leaves,bird*”
不存在于arrayy中的任何字符串中,对吗?我没有完全理解你问的问题。有人能给我解释一下吗。@Ch3steR我正在尝试使用*表达式搜索该字符串,即不提供完整的绝对字符串。对于leaves,bird*-leaves,bird*
search,您需要使用search\re=re.compile(“leaves,bird.*-leaves,bird.*])
从循环中退出,然后执行ifsearch\re.search()
在您的环路中。但是如果我进行搜索,那会返回所有索引吗?或者我需要循环获取索引吗?您仍然需要以类似的方式迭代@Patrick Artner的解决方案“leaves,bird*-leaves,bird*”
不存在于arrayy中的任何字符串中,对吗?我没有完全理解你问的问题。有人能给我解释一下吗。@Ch3steR我正在尝试使用*表达式搜索该字符串,即不提供完整的绝对字符串。使用re.search()
而不是re.match()
不是更好吗。可能会慢一些,但会匹配条目不以“叶子”开头的情况,例如:“mount cycle,tree,leaves,mount road,cycle roo/soo”@urban good point,如果它在字符串内,则重新匹配将无法获得它。结合您的建议。#最好使用re.search()
而不是re.match()
。可能会慢一些,但会匹配条目不以“叶子”开头的情况,例如:“mount cycle,tree,leaves,mount road,cycle roo/soo”@urban good point,如果它在字符串内,则重新匹配将无法获得它。采纳你的建议#