Python:使用正则表达式进行数据验证

3
我正在尝试使用Python正则表达式来验证变量的值。
验证规则如下:
- 该值可以包含任何 a-z、A-Z、0-9 和 *(无空格,无 -,无 ,) - 该值可以以数字(0-9)、字母(a-z、A-Z)或 * 开头 - 该值可以以数字(0-9)、字母(a-z、A-Z)或 * 结尾 - 在中间,该值可以包含数字(0-9)、字母(a-z、A-Z)或 * - 不允许任何其他值
目前我正在使用以下代码片段进行验证:
import re
data = "asdsaq2323-asds"
if re.compile("[a-zA-Z0-9*]+").match(data).group() == data:
    print "match"
else:
    print "no match"

我感觉应该有更好的方法来完成上述操作。我正在寻找类似以下的东西:

validate_func(pattern, data) 
/* returns data if the data passes the validation rules */
/* return None if the data does not passes the validation rules */
/* should not return part of the data which matches the validation rules */

有这样的内置函数存在吗?

[\w\d\*]+ 不够吗?最好的测试方法是使用一个大循环来测试您已经拥有的所有值(在列表/文件中)。当循环中的匹配失败时,您应该将其打印出来,并对其进行更多的研究以找出问题所在,并看看如何优化您的正则表达式。 - user1467267
3个回答

6

在正则表达式中,元字符^$分别表示“字符串开头”和“字符串结尾”,因此,您可以要求正则表达式首先匹配整个字符串,而不是查看匹配的内容并将其与整个字符串进行比较:

import re
data = "asdsaq2323-asds"
if re.compile("^[a-zA-Z0-9*]+$").match(data):
    print "match"
else:
    print "no match"

此外,由于您只使用正则表达式一次——编译它并立即使用——因此您可以使用方便的方法re.match将其作为单个步骤处理:

import re
data = "asdsaq2323-asds"
if re.match("^[a-zA-Z0-9*]+$", data):
    print "match"
else:
    print "no match"

3
为了确保整个字符串与您的模式匹配,请在您的正则表达式中使用字符串开头和结尾的锚点。例如:
regex = re.compile(r'\A[a-zA-Z0-9*]+\Z')
if regex.match(data):
    print "match"
else:
    print "no match"

将其改为函数形式:
def validate_func(regex, data):
    return data if regex.match(data) else None

例子:

>>> regex = re.compile(r'\A[a-zA-Z0-9*]+\Z')
>>> validate_func(regex, 'asdsaq2323-asds')
>>> validate_func(regex, 'asdsaq2323asds')
'asdsaq2323asds'

附带说明,当进行类似于此的验证时,我更喜欢使用\A\Z而不是^$^$的含义可能会根据使用的标志而更改,并且$将匹配字符串末尾的换行符之前。


2
我想你在寻找:

我认为您正在寻找

re.match('^[a-zA-Z0-9*]+$',data) and data

额外的and data只是为了返回数据,但我不确定你为什么需要它。检查re.match结果是否为None就足以检查字符串是否有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接