【问题标题】:1-mismatch regular expression [duplicate]1-不匹配的正则表达式[重复]
【发布时间】:2012-02-21 01:16:53
【问题描述】:

可能重复:
Search for string allowing for one mismatch in any location of the string

我得到一个字符串s 和一个字符串t。是否有一个正则表达式可以在s 中查找所有出现的t最多有一个不匹配的字符。 (最多允许t 中的一个字符替换为另一个字符。)

【问题讨论】:

  • 请添加一些示例数据来玩,这样会更容易
  • @Robjong: This 是我想要做的。
  • 我不是这方面的专家,但您可以使用允许最多 1 个不匹配的变体:en.wikipedia.org/wiki/…
  • @Randomblue - 如果您可以引用另一个涵盖此完全相同主题的 SO 问题,是否应该将其作为重复项关闭?我在另一个问题中发布了几个可能的解决方案,包括一个 pyparsing 解决方案,它不仅可以处理单个不匹配,还可以处理 n 不匹配。你试过这些吗?
  • @PaulMcGuire:是的,应该。我只是在发布后才注意到...

标签: python regex


【解决方案1】:

我不一定会用正则表达式来做这件事。您可以使用 Levenshtein 距离。

>>> import Levenshtein
>>> s = "spam ham and eggs"
>>> t = "ram"
>>> for i,_ in enumerate(s): 
...   s_ = s[i:i+len(t)]
...   if Levenshtein.distance(s_, t) == 1:
...     print s_
... 
pam
ham

【讨论】:

  • 听起来不太理想。即使出现 1 个错误,Levenshtein 也会继续计数
  • 是的,但 Levenshtein 距离非常快,而且它可能不是性能关键代码。过早的优化等等。
  • 除了在他的 cmets 中他说他正在尝试这样做:stackoverflow.com/questions/2420412/… 这是一个相当大的数据集。我认为这还为时过早。
【解决方案2】:

是的,当然。例如,如果t"abcde",那么一个这样的正则表达式是

.bcde|a.cde|ab.de|abc.e|abcd.

也就是说,这几乎肯定不是最好或最有效的方法,尤其是在t 很大的情况下。 (如果它很大,那么您可以通过将其重新表述为

.bcde|a(?:.cde|b(?:.de|c(?:.e|d.)))

或者可能是

a(?:b(?:c(?:d.|.e)|.de)|.cde)|.bcde

但这仍然不是最好的方法。)

【讨论】:

    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    相关资源
    最近更新 更多