我想编写一个正则表达式来检查句子中每个单词的长度,如果所有单词的长度至少为3,则返回True
。此外,整个句子必须只有小写字母。例如,对于字符串“hello world”,它必须返回true结果和字符串“hi world”的错误结果。
以下正则表达式无法按预期工作,它提供True
。
bool(re.compile('(([a-z \ s] {3,})+ $')。match(“hi world”)))
答案 0 :(得分:2)
我认为你不需要正则表达式。你可以这样做:
s = 'this is a sentence of some sort'
words = s.split()
test = [w for w in words if len(w) > 3]
print(len(test) == len(words)) # False
或等效地:
s = 'this is a sentence of some sort'
words = s.split()
acceptable = lambda x: len(x) > 3
print(len(words) == len(list(filter(acceptable, words))))
甚至:
s = 'this is a sentence of some sort'
words = s.split()
res = all(len(word) > 3 for word in words)
print(res)
或者,正如@pault建议的那样:
s = 'this is a sentence of some sort'
all(len(w) > 3 and w.islower() for w in s.split())
答案 1 :(得分:1)
如上所述,这可能不是需要正则表达式的问题,但问题可能是使用正则表达式是正确方法的更大问题的简化。
我的解决方案不会检查每个单词是否符合您的要求,而是尝试找到任何不符合您要求的单词。这意味着我们正在寻找:
导致以下正则表达式:
[^a-z\s]
(^|\s)[a-z]{1,2}(\s|$)
将这些组合在一起得出:([^a-z\s])|((^|\s)[a-z]{1,2}(\s|$))
。这给出了以下可用的Python代码:
import re
pattern = '([^a-z\s])|((^|\s)[a-z]{1,2}(\s|$))'
result1 = not bool(re.search(pattern, 'hello world'))
result2 = not bool(re.search(pattern, 'hi world'))
答案 2 :(得分:1)
答案 3 :(得分:0)
这是一种没有正则表达式的方法:
def all_words_three_or_more(sentence):
sentence_list = sentence.split(' ')
for word in sentence_list:
if len(word) < 3 or word.lower() != word:
return False
return True
测试案例:
test_str_true = "this string will succeed"
test_str_false = "this string is false"
test_str_false_caps = "FAIL THIS BECAUSE CAPS"
print(all_words_three_or_more(test_str_true)) # true
print(all_words_three_or_more(test_str_false)) # false
print(all_words_three_or_more(test_str_false_caps)) #false
答案 4 :(得分:0)
请尝试一下:
import re
pattern = re.compile('([a-z\s]{3,})+$')
all(pattern.match(x) for x in "hello world".split())
输出:
True
和
all(pattern.match(x) for x in "hi world".split())
输出:
False