【问题标题】:Unbalanced Parenthesis Error with re.Compilere.Compile 不平衡括号错误
【发布时间】:2013-05-28 19:48:19
【问题描述】:

我正在将较旧的 Python 代码移植到 Python 3。该代码在 Python 2.7 中运行。以下行正在创建不平衡括号错误:

pp = re.compile('\\\([^\\<\/td\ *\>\([^\<]*)\<\/td\ *\>\[^\<]*\<\/td\ *\>\([^\<]*)\<\/td\ *\>\([^\<]*)\<\/td\ *\>\([^\<]*)\<\/td\ *\>\<\/tr\ *\>')

我不知道如何解决这个问题。任何建议将不胜感激如何分解并弄清楚。

【问题讨论】:

  • 太棒了,蝙蝠侠!使用r'' 原始字符串文字来减少所有这些。 / 不需要转义。
  • 而且代码对我来说在 Python 2.7 上工作。
  • 哦,也许您想改用 HTML 解析器?我怀疑你的代码使用 BeautifulSoup 会简单得多。
  • @MartijnPieters,你是说 WATman 吗? :P 对不起...

标签: python regex python-3.x parentheses


【解决方案1】:

您的表达式几乎无法阅读,大多数\ 反斜杠实际上毫无意义。那些确实有意义的是\[\(\) 组合,其中大部分看起来它们根本不应该存在

例如。 \[^\&lt;] 部分已损坏,因为转义的 \[ 使 ] 括号不平衡。

删除所有反斜杠使模式编译:

>>> re.compile('([^</td *>([^<]*)</td *>[^<]*</td *>([^<]*)</td *>([^<]*)</td *>([^<]*)</td *></tr *>')
<_sre.SRE_Pattern object at 0x7f8c61c76d50>

并不是说这种模式在这种情况下更有意义,因为在开头有一个 [^ 表示一个开放字符类,但它后面的字符表明这不是那里的意图,@987654330 @ 我们很早就看到了可能是那个类的一部分,但是你会匹配任何不在集合 {'&lt;', '/', 't', 'd', ' ', '*', '(', '[', '^', '&lt;'} 中的东西,这可能也不是你想要的。

简而言之,整个表达式被严重破坏,并且在任何 Python 版本中都无法以当前形式工作。

您似乎也在尝试使用正则表达式解析 HTML。这不会很好地工作。请改用适当的 HTML 解析器,例如 BeautifulSoup 将使提取表格单元格数据的任务变得更加简单。

【讨论】:

  • 感谢您的指导。你是对的。新代码会编译。为了澄清起见,这是我继承的旧代码,并被告知它运行正常。我的错误:我应该先自己运行它来验证。我实际上有 4 行这种类型的代码。我将尝试按照您的建议自行修复。顺便说一句,为什么有人会这样编码?我还将查看 BeautifulSoup。谢谢。
  • 好像有人从某个地方复制粘贴了正则表达式,却不了解它的作用;甚至可能来自于为 Perl 或 JavaScript 设计的东西。我无法想象有人真的会写这些并理解他们在做什么。
  • 感谢您的澄清。我会尝试并继续努力。我也会看看 BeautifulSoup。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2014-09-26
相关资源
最近更新 更多