正则表达式 - 弃用警告

Regex expressions - Deprecation warning

以下代码片段来自我的 github 存储库 here。 它打开一个二进制文件,并提取

标签内的文本。这些是关键行:

gbxfile = open(filename,'rb') 
gbx_data = gbxfile.read()
gbx_header = b'(<header)((?s).*)(</header>)'
header_intermediate = re.findall(gbx_header, gbx_data)

该脚本有效,但它收到以下弃用警告:

DeprecationWarning: Flags not at the start of the expression b'(<header)((?s).*)(</' (truncated)
  header_intermediate = re.findall(gbx_header, gbx_data)

gbx_header中正则表达式的正确用法是什么,才不会显示这个警告?

您可以查看Python bug tacker Issue 39394,该警告是在Python 3.6.

中引入的

重点是 Python re 现在不允许在不在字符串开头的地方使用内联修饰符。在 Python 2.x 中,您可以毫无问题地使用您的模式和警告,因为 (?s) 会在幕后默默地应用于整个正则表达式。由于这并不总是预期的行为,Python 开发人员决定发出警告。

请注意,您现在可以在 Python re 中使用内联修饰符组,请参阅

所以,解决方案是

  • 在模式的开头放置 (?s)(或任何其他内联修饰符):(?s)(<header)(.*)(</header>)
  • 使用re选项,re.S/re.DOTALL代替(?s)re.I/re.IGNORECASE代替(?i),等等
  • 使用变通方法(而不是 .,如果您不想使用 (?s) 或 [=16,请使用 [\w\W]/[\d\D]/[\s\S] =]/re.DOTALL).