2016-12-18 56 views
2

只有字符試圖創造出與給定一個正則表達式它包含所有合法字符的功能,如果只包含這些字符的字符串將被檢查。檢查字符串包含從正則表達式

例如

import re 
legal_characters = r'[\*\-]' # Matches asterisc and dash characters 

def is_legal(test_string): 
    if re.match(legal_characters, test_string): 
     print("Legal") 
    else: 
     print("Not legal") 

is_legal("***---123") # should print "Not legal" 
is_legal("AbC123")  # should print "Not legal" 
is_legal("*-*-*")  # should print "Legal" 

輸出:

Not legal 
Not legal 
Not legal 

我真的不明白爲什麼。有人能解釋一下嗎?

+0

在python 3.4上測試過:所有字符串都是合法的; 're'僅匹配第一個字母('<_sre.SRE_Match object; span =(0,1),match ='a'>')。 –

+0

@hiroprotagonist我對正則表達式做出了糟糕的選擇。請參閱修改後的說明.. –

+0

TigerhawkT3是正確的,無論差異有多小,這都是重複的。請看http://stackoverflow.com/questions/1323364/in-python-how-to-check-if-a-string-only-contains-certain-characters,它也包含更完整的答案。 –

回答

3

這再現你想要的:^匹配字符串$結束的開始。在之間有+字符\w = [A-Za-z0-9_]

legal_characters = '^\w+$' 

更新

你的問題進行了修改,這是我的建議:

^字符串$結束的開始相匹配。在之間有重複的[*-]+元素:

legal_characters = '^[*-]+$' 

沒有必要逃脫*-\

如所指出的Maroun Maroun,你可以離開了^match反正掃描字符串的開頭:

legal_characters = '[*-]+$' 
+0

使用'match'時不需要'^',因爲它已經嘗試從字符串的開始處進行匹配。 – Maroun

+0

@MarounMaroun:同意。謝謝! –

2

試試這個:

import re 
legal_characters = r'\w+$' # Matches Unicode word characters 
r = re.compile(legal_characters) 

def is_legal(test_string): 
    if re.match(r, test_string): 
     print("Legal") 
    else: 
     print("Not legal") 

is_legal("aaaAA$") # should print "Not legal" 
is_legal("AAAA***") # should print "Not legal" 
is_legal("AAABBB") # should print "Legal" 

測試在蟒蛇2.7.12。

1

你並不需要使用re。嘗試:

legal_characters = '*-' 

def is_legal(test_string): 
    for s in test_string: 
     if s not in legal_characters: 
      print("Not legal") 
      return 
    print("Legal") 

,輸出是:

>>> is_legal("***---123") 
Not legal 
>>> is_legal("AbC123") 
Not legal 
>>> is_legal("*-*-*") 
Legal 
+0

請注意,這將包括括號作爲允許的字符,他們不應該是。我建議定義'legal_characters = {'*',' - '}'。你也可以將這個簡化爲'def is_legal(test_string):return all(c在test_string中的c在legal_characters中)''。 – TigerhawkT3

+0

好的想法手環也是合法的。是的,我喜歡簡化,但我認爲他想要一個打印功能,而不是返回,如果我理解正確。 – ebeneditos

+0

這可能只是爲了簡化測試呼叫。 – TigerhawkT3

1
import re 
legal_characters = r'[*-]+' # Matches asterisc and dash characters 

def is_legal(test_string): 
    if re.fullmatch(legal_characters, test_string): 
     print("Legal") 
    else: 
     print("Not legal") 
is_legal("***---123") # should print "Not legal" 
is_legal("AbC123")  # should print "Not legal" 
is_legal("*-*-*")  # should print "Legal" 

出來:

Not legal 
Not legal 
Legal 

第一:

特殊字符失去其特殊含義裏面集。對於 例如,[(+*)]將匹配任何文字字符的 '(', '+', '*',或 ')'

比:

re.fullmatch(pattern, string, flags=0) 

如果整個字符串匹配正則表達式模式,返回一個 對應的匹配對象。如果字符串不匹配 模式,則返回無;請注意,這與零長度匹配不同。

相關問題