Python 为什么我的正则表达式分组不正确?

Python 为什么我的正则表达式分组不正确?,python,regex,Python,Regex,文件中的一行示例:“CIS 14A Visual Basic.NET编程I x” 我试图将文件中的行分为三组:组(0)应为课程编号(14A),组(1)应为主题(Visual Basic.NET Programming I),组(2)应为课程所在的季度。然而,当我测试代码时,第(0)组匹配整行,第(1)组是课程,第(2)组是空的,第(3)组是主题和可用宿舍的组合。我找不到它有什么问题,因为每组括号都创建了一个组,但所有组的顺序都不正确,并且由于某种原因,没有包含在任何括号中的“CI”被包含在组(0

文件中的一行示例:“CIS 14A Visual Basic.NET编程I x”

我试图将文件中的行分为三组:组(0)应为课程编号(14A),组(1)应为主题(Visual Basic.NET Programming I),组(2)应为课程所在的季度。然而,当我测试代码时,第(0)组匹配整行,第(1)组是课程,第(2)组是空的,第(3)组是主题和可用宿舍的组合。我找不到它有什么问题,因为每组括号都创建了一个组,但所有组的顺序都不正确,并且由于某种原因,没有包含在任何括号中的“CI”被包含在组(0)中。我是新加入regex的,所以任何关于如何修复我的代码的建议都将不胜感激

    with open(filename) as infile:
        for line in infile:
            self._match = (re.search('^CIS\s(\d*\w*)(\w*)\s?[^x]*(.*)$', line, re.I))
            self._numb = self._match.group(0).strip()
            self._name = self._match.group(1).strip()
            self._quarter=self._match.group(2).strip().split('x')

请注意,由于第0个组是为整个匹配保留的,所以捕获组+1的数量始终与
.group()
s的数量相同

您可以使用的正则表达式是

^CIS\s+([0-9A-Z]+)\s(.*?)\s(x\s.*)

请参阅Python代码片段:

with open(filename, 'r') as infile:
    for line in infile:
        self._match = re.search(r'^CIS\s+([0-9A-Z]+)\s(.*?)\s(x\s.*)', line, re.I)
        if self._match:
            self._numb = self._match.group(1).strip()
            self._name = self._match.group(2).strip()
            self._quarter=self._match.group(3).strip().split('x')
正则表达式详细信息

  • ^
    -字符串的开头
  • CIS
    -文字子字符串
  • \s+
    -1+空格
  • ([0-9A-Z]+)
    -第1组:一个或多个数字或大写字母
  • \s
    -空白
  • (.*)
    -第2组:除换行符以外的任何0个或更多字符,尽可能少
  • \s
    -空白
  • (x\s.*)
    -第3组:
    x
    、空格和除换行符以外的任何0个或更多字符
此外,请检查:


请修复您的缩进尝试
^CIS\s+([0-9A-Z]+)\s(.*)\s(x\s.*)$
,请参阅组(0)始终是完全匹配的。然后你的“括号组”从1@TomerKalish啊,我知道这是一条很好的信息:)哇,这个网站太棒了!我用了很多正则表达式,但我从来不知道。投票赞成:)一句话:取决于确切的格式,但似乎第一组应该是([0-9]+[A-Z]+)哇,我需要更多地学习正则表达式哈哈。现在我的代码中出现了一个错误:builtins.AttributeError:“NoneType”对象没有属性“group”知道如何修复它吗?@drewster您应该阅读一下文档。通常,当re.search找到模式时,将返回匹配对象。如果未找到匹配项,则不返回任何匹配项。这就是你得到这个的原因error@Wiktor谢谢你给我正则表达式语法!