2016-12-18 55 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) 

如果整个字符串匹配正则表达式模式,返回一个 对应的匹配对象。如果字符串不匹配 模式,则返回无;请注意,这与零长度匹配不同。

相关问题