Python 检查字符串是否仅包含正则表达式中的字符
尝试创建一个函数,该函数使用一个包含所有合法字符的正则表达式,如果字符串仅包含这些字符,则将检查该字符串 比如说Python 检查字符串是否仅包含正则表达式中的字符,python,regex,python-3.x,Python,Regex,Python 3.x,尝试创建一个函数,该函数使用一个包含所有合法字符的正则表达式,如果字符串仅包含这些字符,则将检查该字符串 比如说 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:
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
我真的不明白为什么。有人能解释一下吗?试试这个:
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"
在python 2.7.12上测试。这会复制您想要的:
^
匹配字符串的开头$
和结尾。中间有重复的+
字符\w=[A-Za-z0-9.]
legal_characters = '^\w+$'
更新
在修改了你的问题后,我的建议是:
^
匹配字符串的开头$
结尾。中间有重复的+
元素[*-]
:
legal_characters = '^[*-]+$'
无需使用\
转义*-
正如Maroun Maroun所指出的,您可以省略^
,因为match
无论如何都会扫描字符串的开头:
legal_characters = '[*-]+$'
您不需要使用
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
输出:
第一:
特殊字符在集合内部失去其特殊意义。对于
例如,[(++*)]
将匹配任何文字字符“(”,“+”,
“*”或“')”
比:
如果整个字符串与正则表达式模式匹配,则返回
对应的匹配对象。如果字符串不匹配,则返回None
模式;请注意,这与零长度匹配不同
在python 3.4上测试:所有字符串都是合法的
re
只匹配第一个字母(
)。@hiroprotation我在正则表达式中选择得不好。请参阅修改后的说明。TigerhawkT3是正确的,无论差异有多小,这都是重复的。请查看哪个答案更完整。^
在使用match
时不需要,因为它已经尝试从字符串开头匹配。@marounnaroun:同意。谢谢请注意,这将包括括号作为允许的字符,而括号本不应该是。我建议定义legal_字符={'*','-}
。您还可以将其简化为def is_legal(test_string):返回all(test_string中的c为legal_字符)
。好吧,我想大括号也是合法的。是的,我喜欢简化,但如果我理解正确,我想他想要一个打印而不是返回的函数。这可能只是为了简化测试调用。好的,谢谢,我也用简化建议编辑了它。谢谢你的回答。然而,正如我在问题中所说,我确实希望使用正则表达式。除其他原因外,使用正则表达式会更快。
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)