错误:在从编译的Python正则表达式进行的回溯中,没有要重复的内容意味着什么

错误:在从编译的Python正则表达式进行的回溯中,没有要重复的内容意味着什么,python,regex,Python,Regex,我一直在努力理解和改进我在Python中对正则表达式的使用,这是一个有趣的问题 这是一个正则表达式 verbose_signature_pattern_2 = re.compile(""" ^ # begin match at new line \t* # 0-or-more tab [ ]* # 0-or-more blankspaces S # capital S [iI][gG][nN][aA][Tt][uU][

我一直在努力理解和改进我在Python中对正则表达式的使用,这是一个有趣的问题

这是一个正则表达式

verbose_signature_pattern_2 = re.compile("""
^            # begin match at new line
\t*          # 0-or-more tab
[ ]*         # 0-or-more blankspaces
S            # capital S
[iI][gG][nN][aA][Tt][uU][rR][eE]
[sS]?        # 0-or-1 S
\s*          # 0-or-more whitespace
[^0-9]       # anything but [0-9]
$            # newline character
""", re.VERBOSE|re.MULTILINE)
当我运行代码时,我得到一个错误

""", re.VERBOSE|re.MULTILINE)
  File "C:\Python27\lib\re.py", line 190, in compile
return _compile(pattern, flags)
File "C:\Python27\lib\re.py", line 242, in _compile
raise error, v # invalid expression
error: nothing to repeat
如果我去掉制表符(\t)特殊字符上的0或更多限定符,它不会抛出错误

我正在努力寻找那些带有某种变体的单词签名的行,作为行中的第一个单词。我知道我可以使用稍微不同的方法,得到我需要的。然而,我想象文档的创建者可能会将标签移到单词的大致中心,或者他们可能会使用空格。我不想使用\s,因为我不想捕获具有单词签名的行之前的所有空行。具体来说,我试图避免捕获所有这些积垢

'\n\n\n\n            Signature    \n
我只想在输出中看到这一点

'            Signature    \n
我确实意识到我可以很容易地去掉多余的新行字符,但我正试图更准确地理解和做事情。有趣的是,下面的正则表达式有相同的开始,但它似乎按照预期工作。这是我没有得到一个错误时,这一个编译,它似乎给了我什么我想要的-虽然我仍然需要找到一些更多的边缘情况

verbose_item_pattern_2 = re.compile(r"""
^            # begin match at newline
\t*          # 0-or-more tabs
[ ]*         # 0-or-more blanks
I            # a capital I
[tT][eE][mM] # one character from each of the three sets this allows for unknown case
\t*          # 0-or-more tabs
[ ]*         # 0-or-more blanks
\d{1,2}      # 1-or-2 digits
[.]?         # 0-or-1 literal .
\(?          # 0-or-1 literal open paren
[a-e]?       # 0-or-1 letter in the range a-e
\)?          # 0-or-1 closing paren
.*           # any number of unknown characters so we can have words and punctuation
[^0-9]       # anything but [0-9]
$            # 1 newline character
""", re.VERBOSE|re.MULTILINE)

第一个字符串不是原始字符串。因此,当Python编译字符串时(在它进入正则表达式引擎之前),它将替换所有转义序列。因此
\t
实际上将成为字符串中的制表符(而不是反斜杠-t)。但是您使用的是自由空间模式(
re.VERBOSE
)。因此,空白是无关紧要的。您的正则表达式相当于:

^*[ ]*S[iI][gG][nN][aA][Tt][uU][rR][eE][sS]?\s*[^0-9]$
\s
即使在非原始字符串中也保持
\s
,因为它在Python字符串中不是可识别的转义序列

然后就在开始处,
^*
导致了问题,因为您无法重复锚定

这就是为什么您应该总是使用原始字符串来编写正则表达式的原因。然后
\t
只保留反斜杠-t,正则表达式引擎可以将其解释为选项卡


顺便说一下,
[]
中的空格不是问题,因为即使在详细/自由空格模式下,字符类中的空格也很重要。

我的脸变红了。谢谢你没有提醒我我是个白痴,我知道这一定是件傻事。我很感激你仔细的回答,它确实有帮助