1

说我有string1 = "Helloworld33"

我希望能够检查 astring2以使其不包含string1.

string2可以是任意长度的任意字符集。

例如:

string1 = "Helloworld33"

string2 = "ello" (invalid)

          "3hi3" (valid)

          "H e l l o" (valid)

          "Hw3" (valid)

          "I_^&_rld_37482" (invalid)

如何通过 python 中的正则表达式来做到这一点?或者有没有办法做到这一点?

编辑:另外,有没有办法做到这一点,所以它区分大小写?

非常感谢

4

4 回答 4

3

您可以使用difflib模块:

import difflib
def solve(strs, match, n):
    s = difflib.SequenceMatcher(None, strs, match)
    return all(item.size < n for item in s.get_matching_blocks())
... 
>>> solve('Helloworld33', 'ello', 3)
False
>>> solve('Helloworld33', '3hi3', 3)
True
>>> solve('Helloworld33', 'H e l l o', 3)
True
>>> solve('Helloworld33', 'Hw3', 3)
True
>>> solve('Helloworld33', 'I_^&_rld_37482', 3)
False
于 2013-09-09T19:15:21.990 回答
2

您可以创建所有三元组string1,然后检查这些三元组中的任何一个是否出现在string2

string1 = "Helloworld33"
triplets = set([string1[i:i+3] for i in range(len(string1) - 2)])
result = not any(t in string2 for t in triplets)
于 2013-09-09T19:10:09.953 回答
1

查找所有长度为 3 的子字符串,并检查是否有任何子字符串在第二个字符串中。

valid = not any(sub.group(1) in string2 for sub in re.finditer(r"(?=(.{3}))", string1))

这是一个演示:http: //ideone.com/T77mHn

于 2013-09-09T19:12:25.627 回答
0

好吧,这类问题(思维弯曲迭代)往往有优雅的功能解决方案:

def not3(string2, string1):
    if len(string2) < 3:  return True    # reaching here, the sequence wasn't found
    if string2[:3] in string1: return False      # test beginning of string2 for existence in string1
    return not3(string2[1:], string1)  # recurse from next char of string2
于 2013-09-09T19:48:01.877 回答