2016-03-08 37 views
1

所以我試圖創建一個正則表達式子句,它可以檢測到'ACTG'個字符的任何組合,並接受該字符爲有效。而其他任何東西 - 包括'ACTG'和其他一些字符的組合都是無效的。python正則表達式特定字符,任意組合

最終,我會把它帶出while循環,這只是爲了測試目的。現在我相信,只要它以a,c,t或g開頭,它就表示它是有效的......

在正則表達式中是否有一種函數比匹配更適合?

import re 
while (True): 
    DnaString = str(input('enter your polynucleotide chain code hooblah')) 
    if (re.match('([ACTG]+[ACTG]*)', DnaString, flags=0)): 
     #if re.search('^ACTG', DnaString) != -1: 
      print ("valid chain.") 
    else: #(re.search('^[ACTG]+[ACTG]*$', DnaString) == -1): 
     print("invalid chain, please check your input.") 

    if (DnaString.find("end") != -1): 
     print("ohokaybye.") 
     break 
+0

請問你的代碼做你想讓它做什麼?你用'match()'有問題嗎? – RootTwo

回答

2

爲什麼不

if all(c in 'ACGT' for c in DnaString): 
    # Do success 
else: 
    # Do failure 
+0

這麼簡單!謝謝。全部仍然是註冊功能? – ddlem

+0

如果迭代器中的每個值(在這種情況下,生成器'(在'ACGT'中爲c在DnaString中)')評估爲「true」,否則返回「false」,則'all'返回'true'。 – BallpointBen

1

你的問題是,你只是在搜索字符串中的任何的ACTG字符,而不指定沒有別的是允許的。 如果您將正則表達式更改爲^[ACTG]+$,那麼它將按預期工作。 ^和$字符分別表示行的開始和結束的錨點。

因此,上面的正則表達式匹配一個字符串,其中包含一個或多個四個字符,並且不允許任何其他字符在它們之前或之後。

+0

我曾經嘗試過!讓我再嘗試一次。謝謝! – ddlem

+0

編輯:試了一下,現在的作品!不知道中間發生了什麼變化。現在我有:(re.match('^([ACTG] + [ACTG] *)$',DnaString,flags = 0)) – ddlem

+0

雖然[ACTG] *沒有做任何事, '[ACTG] +'是四個字符中的一個或多個**的貪婪匹配,這意味着它匹配儘可能多的字符。匹配儘可能多後,'[ACTG] *'嘗試匹配**零個或多個**字符,找到零(因爲它們已經通過'+'匹配)並結束。所以'^([ACTG] +)$'也能正常工作 – Zhewriix

0

如果允許匹配內部重複可接受的字符,那麼這可能是你想要什麼:

'[A|C|T|G]{4}' 
+0

謝謝!這似乎與我現在所做的一樣。如果它在前四個索引中,那麼它可以工作,但如果稍後使用了另一個字符,則它不會檢測到它是無效的 – ddlem