2016-08-12 97 views
1

我想在python的「匹配對象」中找到一個字符串,但「.find」不起作用。這裏是我的代碼片段:在python中查找匹配對象中的字符串

e_list = [] 
for file in os.listdir('.'): 
    r = re.compile(r".*\.(aaa|bbb)$") 
    e_found = r.search(file) 
    if e_found is not None: 
     e_list.append(e_found.group(0)) 

e_length = len(e_list); 

for num_e in range(e_length): 
    if(e_list[num_e].group(0).find('50M') > 0) 
     print(e_list[num_e].group(0)) 

...現在e_list就像是:

[<_sre.SRE_Match object; span=(0, 7), match='30M.aaa'>, 
<_sre.SRE_Match object; span=(0, 7), match='40M.bbb'>, 
<_sre.SRE_Match object; span=(0, 7), match='50M.aaa'>, 
<_sre.SRE_Match object; span=(0, 7), match='50M.bbb'>, 
<_sre.SRE_Match object; span=(0, 7), match='50M.ccc'>] 

我期待有結果:

'50M.aaa' 
'50M.bbb' 

雖然e_list[0].group(0)回報'30M.aaa'.find不能被應用,因爲它是一個匹配對象。那麼,我該怎麼辦?

+0

如需進一步閱讀:Python的3 「[正則表達式HOWTO](https://docs.python.org/3/howto/regex.html)」 。 –

+2

您應該爲正則表達式使用[raw strings](https://docs.python.org/3/library/re.html#raw-string-notation),以防止與反斜槓和string-vs-regex之間的奇怪交互元字符:'r「。* \。(aaa | bbb)$」'。儘管_this_ regex不需要它,現在開始使用這個習慣會在稍後爲你節省麻煩。 –

+0

致@Kevin J. Chase:哎呀,我以爲我已經在正則表達式前面放了一個'r',但它卻沒有。謝謝你提醒我。 – IanHacker

回答

2

我認爲Python不是你的第一語言,你的代碼聞起來像Java。

請不要使用re.compile,因爲這是不必要的。只需使用re.searchre.findall即可。

而在Python中,你可以使用:

result = re.findall('.*\.(aaa|bbb)$', file) 

然後,result是一個列表,你可以打印或使用for... loop得到它的每一個項目。

正如你也可以使用:

result = re.search('.*\.(aaa|bbb)$', file) 

結果是一組。

然後您應該使用result.group(1)來獲取匹配的項目。

SO,代碼可以是:

e_list = [] 
for file in os.listdir('.'): 
    e_found = re.search(".*\.(aaa|bbb)$", file) 

    if e_found: 
     e_list.append(e_found.group(1)) 


for item in e_list: 
    if item.find('50M') > 0 
     print(item) 
+0

解決你的答案。其實,e_list。append(e_found.group(0))給了我想要的(整個文件名)。除此之外,我完全複製了它,它完美地工作。也謝謝你糾正我的迭代。 – IanHacker

2

要檢查字符串是否以'50M'開頭,請使用str.startswith('50M')。這不會檢測到50M是後綴(test.50M)的情況。

if e_list[num_e].startswith('50M'): 
    print(e_list[num_e]) 

如果後綴是找到50M一個合法的場所,使用in.find('50M') > 0乾淨多了。

if '50M' in e_list[num_e]: 
+1

它沒有工作。看完Kingname的回答後,我注意到最後一部分應該是: if(e_list [num_e] .find('50M')> 0): print(e_list [num_e]) – IanHacker

+1

@IanHacker啊,我明白了。我已經更新了我的答案是正確的 - 我描述的方式比'.find()'更清晰,更具體。 – 2Cubed

+0

是的,現在它工作。謝謝。 – IanHacker