我需要能夠查看一個字串是否只包含一個子字串或一個字母,而沒有別的。
說我想檢測World
這將包含子字串,但它也有不同順序的不同字母
"Hello World"
這不包含任何不同的字母或順序,只是子字串 3 次
"WorldWorldWorld"
如果我想檢測_
這不會通過
"Hello_World"
但這會
"___"
我該怎么做呢?
uj5u.com熱心網友回復:
您可以使用正則運算式,re.escape用于生成與目標的一個或多個連續出現匹配的模式(分別使用^和$指示字串的開頭和結尾)以及re.match確定它是否匹配所需的模式:
import re
target = "World"
data = "World" * 3
pattern = f"^({re.escape(target)}) $"
re.match(pattern, data) is not None
這輸出:
True
uj5u.com熱心網友回復:
不需要正則運算式。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)
uj5u.com熱心網友回復:
方法一:
如果沒有正則運算式(正則運算式),可以簡單地使用sets。首先,將有s問題的字串拆分為與 substring 長度相同的子字串substr。用這些子串制作一組s_set。如果該集合只有 1 個元素,并且該元素在 中substr,則 print 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
方法二:
如果速度很重要,那么對于很長的字串,一旦找到第一個不匹配的子字串就停止是有意義的,就像在這個解決方案中一樣:
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
uj5u.com熱心網友回復:
使用正則運算式。
if re.match("(?:World) ", s):
僅當s包含一個或多個重復的 string時才成功World,沒有別的。
uj5u.com熱心網友回復:
這是正則運算式的作業,re.match().
import re
re.match(r"(?:World) ", "World")
re.match(r"(?:World) ", "Hello World")
re.match(r"(?:World) ", "WorldWorldWorld")
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/477167.html
上一篇:更改Python字典中的鍵
下一篇:從串列中洗掉NOT重復值
