【问题标题】:Regex works in Sublime, not in Python (Jupyter)正则表达式适用于 Sublime,而不适用于 Python (Jupyter)
【发布时间】:2019-04-18 19:14:29
【问题描述】:

我正在创建一个 Jupyter 笔记本,以使用我在 Sublime 中测试的正则表达式代码清理大量小说。 我的很多文本都包含“由 Google 数字化”的短语,因为我从那里获得了通过光学字符识别运行的 PDF。 我想删除所有包含短语“数字化”或更确切地说是“数字化”的句子,因为第一部分并不总是正确转录。

当我在 Sublimes 'replace function' 中使用这个短语时,我得到了我想要的结果:

^.*igitized.*$

但是,当我尝试在 Jupyter 笔记本中使用 re.sub 方法(该方法适用于其他一些短语)时,“Google 数字化”行未正确识别并被“无”替换。

text = re.sub(r'^.*igitized.*$', '', text)

我错过了什么?

【问题讨论】:

  • 正则表达式看起来不错,如果Digitized... 从行首开始,是否会出现所有情况?
  • 您是否尝试过使用非贪婪量词?我会想象你的正则表达式字符串的开头, (^.*) 默认情况下会是贪婪的,并消耗它后面的所有内容。您可以尝试将字符串更改为 r'^.*?igitized.*?$' 吗?问号告诉正则表达式,前一个量词是非贪婪的,应该匹配尽可能少的东西 - 所以一旦找到 igitized 它将停止消费字符
  • 您是一次针对 1 行还是针对整个文件运行正则表达式?此正则表达式仅在您一次针对 1 行运行时才有效,您无法提供整个文件。

标签: python regex jupyter


【解决方案1】:

默认情况下,'^' 仅匹配字符串的开头,而 '$' 仅匹配字符串的结尾以及字符串末尾的换行符(如果有)之前。添加 re.MULTILINE 标志以匹配行首。

text = re.sub(r'^.*igitized.*$', '', text, flags=re.MULTILINE)

Using ^ to match beginning of line in Python regex

【讨论】:

  • 嗨,Serge,re.sub 不接受“flag”作为附加项,但是一旦我删除它们,你对 ^ 和 $ 的解释就像一个魅力。非常感谢!
  • 其实是flags
猜你喜欢
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2020-08-28
  • 2019-12-02
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多