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)