【问题标题】:writing a validator for hashtag fields in model of django在 django 模型中为标签字段编写验证器
【发布时间】:2019-04-15 11:52:06
【问题描述】:

我有一个包含一些字段的模型:

class Book(models.Model):
    title = models.CharField(max_length=160, help_text='H1(SEO)',blank=True)
    hashtags = models.TextField(blank=True, validators=[validate_hashtags])

主题标签输入应如下所示:

#sth #sth #sth

事实上,除了最后一个主题标签之外,我需要在每个主题标签之后留一个空格(最后一个主题标签后面不需要任何空格)。这是我使用正则表达式的验证器函数

def validate_hashtags(value):
    string1 = value.split()
    string2 = re.findall("(#\\w+ )", value)
    if re.match("^#\\w+$", string1[-1]):
        matching_counter = len(string2) + 1
    else:
        matching_counter = len(string2)
    if len(string1) != matching_counter:
        raise ValidationError("please enter # in the correct format")

但它不能正常工作,有人可以帮助我吗?

【问题讨论】:

    标签: python regex django validation


    【解决方案1】:

    您可以使用此正则表达式来验证输入。在这种情况下不需要拆分。

    ^(#\w+\s+)+$

    #sth #sth #sth - Valid
    #sth sth #sth - Invalid
    #sth#sth #sth  - Invalid
    

    希望它能解决问题。

    【讨论】:

    • @m.ar 您已切换接受的答案,但请注意 this pattern#sth #sth #sth 不匹配,如果它是该行上的唯一文本。仅当后面有 1+ 个空格字符时才匹配,\s 也将匹配换行符,因此它也可以匹配所有空的后续换行符。量词还会重复不必要的捕获组。
    【解决方案2】:

    如果最后一个主题标签后没有空格,您可以使用匹配一个主题标签后跟 1+ 个单词字符,然后重复匹配一个空格和 1+ 个单词字符的组。

    ^#\w+(?: #\w+)*$
    

    解释

    • ^断言字符串开始
    • #\w+ 匹配 #,然后匹配 1+ 个单词字符
    • (?: #\w+)* 非捕获组,重复 0+ 次空格,# 和 1+ 单词字符
    • $ 断言字符串结束

    Regex demo

    如果模式后可以有 1+ 个空格或制表符,您可以重复 character class [ \t]+:

    ^#\w+(?:[ \t]+#\w+)*$
    

    Regex demo

    【讨论】:

      猜你喜欢
      • 2020-02-08
      • 2019-12-24
      • 2010-12-10
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      相关资源
      最近更新 更多