python - 如何查看字符串是否仅在 python 中包含 substring

我需要能够查看一个字符串是否只包含一个 substring 或一个字母,而没有别的。

假设我想检测 World

这将包含 substring 但它也有不同顺序的不同字母

"Hello World"

这不包含任何不同的字母或顺序,只是 substring 3 次

"WorldWorldWorld"

如果我想检测 _

这不会通过

"Hello_World"

但这会

"___"

我该怎么做呢?

回答1

不需要正则表达式。依赖于 https://docs.python.org/3/library/stdtypes.html#str.count 计算非重叠事件的事实

len(target) * data.count(target) == len(data)

简单的字符串方法比这里的正则表达式快 400-800%:

>>> import re
>>> target = "World"
>>> data = "World" * 3
>>> pattern = f"^({re.escape(target)})+$"
>>> %timeit len(target) * data.count(target) == len(data)
115 ns ± 0.352 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
>>> %timeit re.match(pattern, data) is not None
456 ns ± 2.88 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
>>> %timeit bool(data.replace(target, ''))  # str.replace is faster again
51.7 ns ± 0.269 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)

回答2

您可以使用正则表达式,使用 re.escape 生成匹配目标的一个或多个连续出现的模式(使用 ^$ 分别表示字符串的开头和结尾)以及 re.match 来确定它是否匹配所需的模式:

import re

target = "World"
data = "World" * 3

pattern = f"^({re.escape(target)})+$"
re.match(pattern, data) is not None

这输出:

True

回答3

方法一:

如果没有正则表达式(regexes),可以简单地使用https://docs.python.org/tutorial/datastructures.html#sets。首先,将有问题的字符串 s 拆分为与 substring substr 长度相同的 substrings。用这些 substrings 制作一组 s_set。如果该集合只有 1 个元素,并且该元素在 substr 中,则打印 True,否则打印 False

strs = ["WorldWorldWorld", "Hello World"]
substr = "World"
len_substr = len(substr)

for s in strs:
    s_set = set(s[i:(i + len_substr)] for i in range(0, len(s), len_substr))
    print(len(s_set) == 1 and substr in s_set)
# True
# False

方法二:

如果速度很重要,那么对于很长的字符串,一旦发现第一个不匹配的 substring 就停止是有意义的,如以下解决方案所示:

for s in strs:
    only_substr = True
    for i in range(0, len(s), len_substr):
        cur_substr = s[i:(i + len_substr)]
        if cur_substr != substr:
            only_substr = False
            break
    print(only_substr)
# True
# False

回答4

使用正则表达式。

if re.match("(?:World)+", s):

这只有在 s 包含一个或多个重复的字符串 World 时才会成功,没有别的。

回答5

这是正则表达式的工作,https://docs.python.org/3/library/re.html?highlight=re#re.match

import re

re.match(r"(?:World)+", "World")
re.match(r"(?:World)+", "Hello World")
re.match(r"(?:World)+", "WorldWorldWorld")

相似文章

sql - 在列中使用 SQL 分隔字母和数字

我有记录,有时带有一个文本和一个数字,有时带有两个、三个或四个,它们用两点“:”分隔。我想将数字和文本拆分为多列。这是一个记录示例:3月:4月1日:5月2日:6月10日:1期望的结果:Str_1ite...

最新文章