【问题标题】:regex expression to match a pattern only if it preceded by one of the words in a list正则表达式仅当它前面是列表中的单词之一时才匹配模式
【发布时间】:2018-04-02 05:12:49
【问题描述】:

我是 python 正则表达式的新手。我尝试通过网络从我的问题中找到答案,但这些都不起作用。我试图用“is”替换's,只有当它前面有一个单数代词时。所以像“he's”、“it's”等单词要替换为“he is”、“it is”。

我尝试的是:

line1 = "已经完成了。但是你还需要做一些事情。Gary 的狗在警局里。把它带回家。太远了。下雨了"

re.sub("(?

我得到的答案:

已经完成了。但还有一些事情要做。Gary 的狗在警局里。把它带回家。太远了。下雨了”

它在前两句中做我想要的,但在后面的句子中没有。谁能指出我的错误和解决方法?

【问题讨论】:

  • 尝试使用降价来更好地描述您的code。这将有助于提高可读性

标签: regex python-3.x


【解决方案1】:

你有两个问题。首先,您将正则表达式字符类与交替混淆。您当前的回顾并不代表您的想法:

(?<=[it|that|here|there|he|she])

这意味着前一个字符是类中的字符之一,不是单词之一。和这个是一样的:

[aehirst|]

但即使解决这个问题也行不通,因为re.sub 不支持可变宽度的lookbehinds。我们可以通过捕获前一个术语然后在替换中使用它来解决这个问题:

re.sub("(it|that|here|there|he|she)'s", '\\1 is', line1, flags=re.IGNORECASE)

It is done. But there is some more you have to do. Gary's dog is in the precinct.
Get it home. It is too far. There is rain

Demo

【讨论】:

  • 不能在 python36 中运行 - raise error("look-behind requires fixed-width pattern")
  • 我按照你的建议跑了,这就是我得到的结果。我敢肯定你在发帖前就跑了,但为什么在我的情况下它不起作用“它已经完成了。但是 \x01 是你必须做的更多事情。加里的狗在辖区内。把它带回家。太远了。 T\x01 是雨”​
  • @ShreshthaKulkarni 我的回答中有一些小错误,毫无疑问是因为没有测试我的代码。检查更新的答案和演示,现在一切正常。
【解决方案2】:

虽然我不确定它是否会很有帮助,但它确实有用:

去掉re.IGNORECASE 选项。

>>> re.sub("(?<=[it|that|here|there|he|she])'s",' is',line1)
"It is done. But there is some more you have to do. Gary's dog is in the precinct. Get it home. It is too far. There is rain"

【讨论】:

  • 如果您的建议有效,那只能靠运气了。 (&lt;=[it|that...] 的后视 匹配整个单词,而只匹配一类字符。你的答案不应该被使用,至少不应该被使用。
  • 但我用粗体字写在上面说我的解决方案对大多数情况不是很有帮助,但至少 它有效。
  • 您的模式会将单词Gene's 替换为Gene is。同样,巧合的是,输入给它工作,但这不应该被依赖。
  • 是的,没错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多