首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何查看字符串是否仅包含python中的子字符串

如何查看字符串是否仅包含python中的子字符串
EN

Stack Overflow用户
提问于 2022-05-18 19:52:52
回答 5查看 728关注 0票数 1

我需要能够看到一个字符串是否只包含一个子字符串或一个字母,而不包含其他任何内容。

说我想检测World

这将包含子字符串,但它也有不同的字母顺序。

代码语言:javascript
运行
复制
"Hello World"

这不包含任何不同的字母或顺序,只包含3次子字符串

代码语言:javascript
运行
复制
"WorldWorldWorld"

如果我想检测_

这是不会过去的

代码语言:javascript
运行
复制
"Hello_World"

但这会

代码语言:javascript
运行
复制
"___"

我该怎么做?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2022-05-18 20:19:47

不需要审判。依赖于str.count计数不重叠事件的事实

代码语言:javascript
运行
复制
len(target) * data.count(target) == len(data)

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

代码语言:javascript
运行
复制
>>> 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
EN

Stack Overflow用户

发布于 2022-05-18 19:58:18

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

代码语言:javascript
运行
复制
import re

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

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

这一产出如下:

代码语言:javascript
运行
复制
True
票数 1
EN

Stack Overflow用户

发布于 2022-05-18 20:08:41

方法1:

没有正则表达式(regexes),就可以简单地使用集合。首先,将问题中的字符串s拆分为与子字符串substr相同长度的子字符串。将这些子字符串设置为s_set。如果该集合只有一个元素,并且该元素在substr中,则打印True,否则打印False

代码语言:javascript
运行
复制
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

方法2:

如果速度很重要,那么对于非常长的字符串,只要找到第一个不匹配的子字符串,就应该立即停止,如下所示:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72295212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档