2015-10-26 19 views
2

我想在文本文件中搜索包含特定字符串的行。如何在Python中的文本文件中搜索行首先有空格

例子,我搜索線包含字符串umask 022,沒有行/etc/profile文件發表評論。

我的代碼:

def check_umask(fname, umask): 
    with open(fname) as f: 
     return any(umask in line for line in f) 
check_umask('/etc/profile','umask 022') 

有了上面的代碼,但它顯示出線路點評:

# ..... 
# By default, we want ... umask 022 
     # bla..bla... umask 022 
......... 
umask 022 

那麼,如何只顯示行包含umask 022腳本,而不是行有何評論?

回答

1

您可以使用的stripstartswith組合。

def check_umask(fname, umask): 
    with open(fname) as f: 
     for line in f: 
      if not line.strip().startswith('#') and 'umask 022' in line: 
       print line 
check_umask('/etc/profile','umask 022') 

例子:

>>> s = '''# ..... 
# By default, we want ... umask 022 
     # bla..bla... umask 022 
......... 
umask 022'''.splitlines() 
>>> for line in s: 
    if not line.strip().startswith('#') and 'umask 022' in line: 
     print line 


umask 022 
>>> 

for line in s: 
    if re.search(r'^[^#]*umask 022', line): 
     print line 
+0

與我的情況,它的工作!非常感謝Avinash! – GLife

+0

歡迎的話,我建議你閱讀本http://stackoverflow.com/help/accepted-answer –

0
mo = re.search(r'[^#]*umask 022', line) 
if mo: 
    print(mo.group()) 
+0

你忘了啓動錨.. –

+0

OP表現出一個符合#不在行的開頭,所以我也不要忘記 – LetzerWille

0

您可以使用str.find()比較指標。如果沒有找到匹配,則返回-1,所以我們可以把它轉換成一個truthy/falsey值加1:

for line in content: 
    p = line.find('#') + 1 
    u = line.find('umask 022') + 1 
    if u and (not p or p > u): 
     print(line) 
0

我又有其他的問題,我的情況。之前「#」是一個有效的命令。

export PATH=$PATH:/... # umask 022 

所以,@ Raj的腳本仍然顯示這一行,通過它在評論中包含「umask 022」。 那麼,我們有解決辦法嗎?

+0

檢查我的更新......' –

+0

我會嘗試,謝謝 – GLife

相關問題