【问题标题】:regular expression not giving complete match正则表达式没有给出完全匹配
【发布时间】:2015-07-17 14:16:39
【问题描述】:

我正在尝试使用正则表达式在字符串中找到它。

  : [J, BASIC]
  ? [CINTERMEDIATE]
  : [D,MEDIUM]

第一个字符可以是 ':' 或 '?' 然后是空格,然后是方括号 在方括号内有两个文本块,由逗号和/或空格分隔。逗号或空格可能存在也可能不存在

这是我为找到这个而写的

regex = re.compile('[:|?\s[\w[,\s]?\w]]+')

但它只找到了

'C]'
'E]'
'M]'

【问题讨论】:

  • 你忘了转义一些[

标签: python regex python-2.7


【解决方案1】:

您的正则表达式未将[ 视为文字。它们被视为特殊字符(字符集)

您可以使用以下内容:

[:?]\s*\[\w+(\s*,\s*)?\w+\]

解释:

  • [:?]第一个字符可以是':'或'?'
  • \s*\[ 然后是空格,然后是方括号
  • \w+(\s*,\s*)?\w+ 在方括号内有两个文本块,由逗号和/或空格分隔(可选逗号和空格)
  • \]右括号

DEMO

编辑:如果你想捕捉比赛,你可以使用:

([:?]\s*\[\w+(?:\s*,\s*)?\w+\])

【讨论】:

  • \s* 这部分将匹配天气它是: [J, BASIC]:[J, BASIC]
  • 管道'|'有什么用然后 ?我在某处看到它的“或”条件
  • 也根据docs.python.org/2/howto/regex.html 元字符在类中不活动。例如,[akm$] 将匹配任何字符“a”、“k”、“m”或“$”; '$' 通常是一个元字符,但在字符类中它被剥夺了它的特殊性质。这同样不适用于 '[' ?
  • @Ankit .. 管道在字符类[..] 之外用作or 运算符(默认情况下,字符类中包含or 的字符)。还有.. [:?]\s*[\w+\s*,*\s*\w+] 不应该使用,我建议你阅读字符集here
  • (?:<something>) 表示match <something> but dont capture it in a group.. 以前我正在捕获\s*,\s*.. 现在我将它保存在非捕获组((?: <something>))中并捕获了整个比赛(从头到尾)
【解决方案2】:
[:?]\s+\[[^, \]]*[, ]?[^\]]*\]

你可以试试这个模式。查看演示。

https://regex101.com/r/bN8dL3/8#python

【讨论】:

    【解决方案3】:
    [:?]\s\[[^\]]+?\]
    

    Debuggex Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      相关资源
      最近更新 更多