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

3

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

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

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

1
我有点困惑。你能提供一些不应该匹配的例子吗? - Chris
1
“合并”/w/W不会匹配所有内容吗? - Scott Hunter
@Chris 我会在编辑中提供一些例子;例如,这个不应该匹配,因为它是用空格分隔的 a b, c, d - EB2127
@ScottHunter 我已经尝试使用反例编辑了这个问题;字符串应该是逗号分隔的。 - EB2127
2个回答

1

您可以使用

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

请查看正则表达式演示

详情

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

1
感谢您的帮助,特别是详细的解释。我相信这确实有效——我已经列举了一些反例。 - EB2127
其实,我有一个澄清问题,应该有助于我的理解:假设存在尾随空格,例如 "foo-bar, hey_friend, 56-8, 7_88, elephant$n "。我认为这应该是有效的...所以,为了更改上面的正则表达式以允许此操作,我尝试使用 ^[^\s,]+(?:,\s*[^,]+)*$,但这会允许单词之间有空格。 - EB2127
我认为这个应该可以,对吧? ^[^\s,]+(?:,\s*[^\s,]+)*\s*$ 很抱歉要问这个问题——我只是想确保我正在学习 :) - EB2127
1
@EB2127 只需在正则表达式模式的开头和结尾添加\s*以匹配前导/尾随空格,^\s*[^\s,]+(?:,\s*[^\s,]+)*\s*$ - Wiktor Stribiżew

0

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

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

谢谢你的帮助。这个还不太行——我已经提供了一些反例。 - EB2127

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