特殊字符处的Python re.finditer错误

时间:2018-11-23 11:43:00

标签: python-3.x

我有遍历字符串列表的代码,然后遍历该字符串在另一个字符串中的每次出现的代码。在到达以问号(?I)开头的字符串之前,这似乎一直有效。

这是代码。

dtID = 0
for datum in sorted(datumList, key=operator.attrgetter('Sum'), reverse = True):
    datum.ID = dtID
    for foundDatum in re.finditer(datum.Name, text):
        datumLocList.append(DatumLoc(dtID,foundDatum.start()))
    dtID += 1

我该如何解决?

Traceback (most recent call last):
  File "C:\Users\trist\Documents\Python\The Compressor\The Compressor.py", line 97, in <module>
    compress()
  File "C:\Users\trist\Documents\Python\The Compressor\The Compressor.py", line 73, in compress
    for foundDatum in re.finditer(datum.Name, text):
  File "C:\Program Files\Python37\lib\re.py", line 230, in finditer
    return _compile(pattern, flags).finditer(string)
  File "C:\Program Files\Python37\lib\re.py", line 286, in _compile
    p = sre_compile.compile(pattern, flags)
  File "C:\Program Files\Python37\lib\sre_compile.py", line 764, in compile
    p = sre_parse.parse(p, flags)
  File "C:\Program Files\Python37\lib\sre_parse.py", line 930, in parse
    p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0)
  File "C:\Program Files\Python37\lib\sre_parse.py", line 426, in _parse_sub
    not nested and not items))
  File "C:\Program Files\Python37\lib\sre_parse.py", line 651, in _parse
    source.tell() - here + len(this))
re.error: nothing to repeat at position 0

1 个答案:

答案 0 :(得分:2)

您的包含问号的模式字符串被视为正则表达式特殊字符。 ?符号尝试匹配前面的正则表达式的0或1个重复。由于在你的字符串?是第一个字符,它正尝试匹配前面的正则表达式的0或1个重复,这没什么:因此,您的“什么都不会在位置0重复”错误。

为避免这种情况,您可以使用re.escape()方法,该方法将转义模式字符串中的所有RE特殊字符。

for foundDatum in re.finditer(re.escape(datum.Name), text):
    datumLocList.append(DatumLoc(dtID,foundDatum.start()))

请参见https://docs.python.org/3/library/re.html#re.escape