【问题标题】:Python: "unexpected end of regular expression" during re.compile, empty bracketsPython:re.compile期间“正则表达式意外结束”,空括号
【发布时间】:2023-03-20 08:12:01
【问题描述】:

总结一下我有re.compile这样的声明:

markers = ['x'] # some list
re.compile(r" *[{}].*(?=\n|$)".format('\\'.join([''] + markers)))

在大多数情况下,它可以正常工作除非markers 为空并且 RegEx 模式看起来像这样:

pattern = ' *[].*(?=\\n|$)'

为什么空字符集有问题?使其适用于空 markers 列表的解决方法是什么?

解决方案

学分:Martijn PietersWiktor StribiżewAmadan

总结一下:

  • 空字符集 在 RegEx 中不存在。 [] 的解析方式与 [a 类似,因此解释器期望关闭 ],这会导致错误,
  • 必须在编译此模式之前检查空的markers,以避免无效的空括号[]
  • .*(?=\n|$)有多余的(?=\n|$),可以简化为.*
  • 要在括号内有效地转义特殊字符[],最好使用re.escape()

为我的问题添加解决方案是:

if markers:
    re.compile(r" *[{}].*".format(re.escape(''.join(markers))))
else:
    # something

【问题讨论】:

  • 没有空字符类,所以[]无效。测试一个空的标记列表并编译一个更简单的表达式?
  • 另外,(?=\n|$) 是多余的。
  • 好吧,当前代码抛出了一个异常,因为\x 不是一个有效的模式(它后面必须有 2 位数字)。你不能像那样逃避任何你想要的角色。
  • 所以markers 为空,您基本上是在寻找一些空白。另一个注意事项:只需使用re.escape(),而不是使用\手动添加所有内容。
  • @MartijnPieters:不是无效的,只是不完整。 re.compile(r"[]]").sub("found", "]")。具体来说,在字符类中转义右括号有两种方法:通过添加反斜杠,或确保它是字符类中的第一个字符。所以当你写[]时,就像写[a一样——正则表达式仍然希望你关闭括号。

标签: python regex python-2.7


【解决方案1】:

您可以在最开始检查标记列表是否为空,然后,只对字符类中必须转义的字符进行转义:^\,@987654324 @、[-

注意,如果标记列表为空,则模式变为 *.*,基本上接受任何行。您可以将其与"^.*$" 匹配。

这是我的建议:

import re
markers = ['x', ']', '[', '-', '^', '\\'] # some list
global p
#markers = [] # some list
if markers:
    escaped = [re.sub(r"[][^\\-]", r"\\\g<0>", x) for x in markers]
    pat = r" *[{}].*".format("".join(escaped))
    p = re.compile(pat)
else:
    p = re.compile("^.*$")

print(p.pattern)

Python demo

此外,.*(?=\n|$) 实际上可以简化为.*,因为. 匹配除换行符以外的任何字符(它也可以匹配 CR 符号)并且.* 将始终匹配直到@987654334 的所有字符@ 或字符串结尾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多