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

Posted

技术标签:

【中文标题】正则表达式:允许逗号分隔的字符串,包括字符和非字符【英文标题】:Regex: allow comma-separated strings, including characters and non-characters 【发布时间】:2020-12-25 06:29:05 【问题描述】:

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

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

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

【问题讨论】:

我很困惑。你能提供一些不应该匹配的例子吗? 不会“组合”/w/W 匹配所有内容 @Chris 我将在编辑中提供一些示例;例如,这不应该匹配,因为它是空格分隔的a b, c, d @ScottHunter 我试图用反例来编辑问题;字符串应该用逗号分隔。 【参考方案1】:

你可以使用

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

见regex demo

详情

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

【讨论】:

感谢您的帮助,尤其是对详尽的解释。我相信这确实有效——我在上面列出了一些反例。 实际上,我确实有一个澄清性问题应该有助于我的理解:假设有尾随空格,例如"foo-bar, hey_friend, 56-8, 7_88, elephant$n "。我认为这应该是有效的....所以,为了更改上述正则表达式以允许这样做,我尝试了^[^\s,]+(?:,\s*[^,]+)*$,但这允许单词之间有空格 我认为这可行,对吧? ^[^\s,]+(?:,\s*[^\s,]+)*\s*$很抱歉问这个问题---我只是想确保我正在学习:) @EB2127 只需在正则表达式模式的开头和结尾添加\s* 以匹配前导/尾随空格^\s*[^\s,]+(?:,\s*[^\s,]+)*\s*$【参考方案2】:

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

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

【讨论】:

感谢您的帮助。这不太行——我在上面提供了一些反例。

以上是关于正则表达式:允许逗号分隔的字符串,包括字符和非字符的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式的逗号分隔字符串到数组

1 到 150 之间的有效字符串的正则表达式,以逗号和连字符分隔

使用正则表达式拆分字符串时跳过逗号分隔字符串中的空格

如何使用正则表达式验证逗号分隔的字符串 [重复]

java 正则表达式匹配字符串,包含没有数字的单词,并且可以选择用逗号分隔

使用 pandas 正则表达式基于逗号字符分隔列数据