【问题标题】: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 我试图用反例来编辑问题;字符串应该用逗号分隔。

标签: python regex string match comma


【解决方案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+)*$"

【讨论】:

  • 感谢您的帮助。这不太行——我在上面提供了一些反例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多