正则表达式:允许使用逗号分隔的字符串,包括字符和非字符

问题描述

我发现很难完成此正则表达式。

以下正则表达式检查用逗号分隔的字符串的有效性:^(\w+)(,\s*\w+)*$

因此,这将与以下逗号分隔的字符串匹配:

import re
pattern = re.compile(r"^(\w+)(,\s*\w+)*$")
valid_string = "foo,bar,hey,friend,56,7,elephant"
pattern.match(valid_string)

然后,我可以使用^(\W+)(,\s*\W+)*$对非字符执行相同的操作,该命令将匹配:

import re
pattern = re.compile(r"^(\W+)(,\s*\W+)*$")
valid_string = "%,$,*,$$"
pattern.match(valid_string)

我想创建一个正则表达式,以匹配包含特殊字符,连字符和下划线的字符串,例如

foo-bar,hey_friend,56-8,7_88,elephant$n

我该如何“组合” /w/W来实现这一目标?

编辑: 以下是无效字符串的一些示例:

invalid1 = "aa,b,c d e"

这是无效的,因为它是用空格隔开的,必须用逗号隔开。

这是另一个例子:

invalid2 = "a,c,d"

这是无效的,因为有两个逗号。只能有一个

解决方法

您可以使用

^[^\s,]+(?:,\s*[^\s,]+)*$

请参见regex demo

详细信息

  • ^-字符串的开头
  • [^\s,]+-除空格和逗号之外的1个或多个字符
  • (?:,]+)*-0次或多次出现
    • ,-逗号
    • \s*-0 +空格字符
    • [^\s,]+-除空格和逗号之外的1个或多个字符
  • $-字符串的结尾。
,

这是您需要的正则表达式吗?

r"^(\w+[\W_]\w+)(,\s*\w+[\W_]\w+)*$"