【问题标题】:Python look-behind regex issue: Invalid regular expression: look-behind requires fixed-width patternPython 后视正则表达式问题:无效的正则表达式:后视需要固定宽度的模式
【发布时间】:2014-07-09 23:36:37
【问题描述】:

我需要在双引号之间匹配一个换行符,如:

<p class="calibre1">“This is the first sentence.</p>
<p class="calibre1">And this is the second!”</p>

这将匹配&lt;/p&gt; &lt;p class="calibre1"&gt;

现在,我使用正则表达式 (?&lt;=“[^”]*)&lt;/p&gt;\s*&lt;p[^&gt;]*&gt;(?!“) 进行了此操作,但是当我尝试非手动使用它。我需要这个正则表达式用于电子书管理/编辑程序 Calibre,它使用 Python 作为其正则表达式引擎。上面的正则表达式适用于手动搜索一本书,但是当我尝试将正则表达式包含为“常用选项”(在每次电子书转换时运行)时,我得到了那个错误。

如果没有可变宽度的后视,我不知道如何做到这一点,因为你不知道从左双引号到换行符会有多长时间。非常感谢您的帮助!

【问题讨论】:

  • 在您继续之前,请考虑 HTML 不是常规语言,因此除非您要解析该语言的最小子集,否则请尝试使用除正则表达式之外的其他内容。
  • @msvalkon 没有任何其他选项,因为正如我所说,我正在使用 Calibre,一个电子书编辑程序。对于这种情况,别无选择,只能使用正则表达式。

标签: python regex calibre


【解决方案1】:

Lookbehinds 必须是零宽度,因此不允许使用量词。

【讨论】:

    【解决方案2】:

    Python re 模块,与大多数语言(.NET 除外)一样,不支持可变长度后视。

    你不能改用capturing group 吗?

    “[^”]*(</p>\s*<p[^>]*>)
    

    first capturing group 中的数据。

    【讨论】:

    • 好主意!它不是很漂亮,但匹配 “([^”]*)&lt;/p&gt;\s*&lt;p[^&gt;]*&gt;(?!“) 并替换为 “\1 似乎可行。
    • @Zajora 哦,这就是你想做的吗?顺便说一句,&lt;p[^&gt;]*&gt;(?!“) 的意思是“&lt;p...&gt; 标签没有直接跟在之后”。这就是你想要的吗?
    • 是的。看起来确实有点奇怪,但我不得不添加(?!“),因为有些电子书的引号是颠倒的(可能是某种转换错误)......或者至少,我认为这是问题所在。现在我正在看它,我开始怀疑..
    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    相关资源
    最近更新 更多