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

Regex: allow comma-separated strings, including characters and non-characters

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

以下正则表达式检查逗号分隔字符串的有效性:^(\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"

这是无效的,因为它是 space 分隔的---必须用逗号分隔。

这是另一个例子:

invalid2 = "a, ,b, c, d"

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

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

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

您可以使用

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

regex demo

详情

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