正则表达式:允许逗号分隔的字符串,包括字符和非字符
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 之间的有效字符串的正则表达式,以逗号和连字符分隔