正则表达式匹配Python中句子中每个单词的最小长度

时间:2018-04-26 13:53:32

标签: python regex

我想编写一个正则表达式来检查句子中每个单词的长度,如果所有单词的长度至少为3,则返回True。此外,整个句子必须只有小写字母。例如,对于字符串“hello world”,它必须返回true结果和字符串“hi world”的错误结果。

以下正则表达式无法按预期工作,它提供True

  

bool(re.compile('(([a-z \ s] {3,})+ $')。match(“hi world”)))

5 个答案:

答案 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)

如上所述,这可能不是需要正则表达式的问题,但问题可能是使用正则表达式是正确方法的更大问题的简化。

我的解决方案不会检查每个单词是否符合您的要求,而是尝试找到任何不符合您要求的单词。这意味着我们正在寻找:

  1. 任何非小写字母或空格字符的字符
  2. 小于最小长度的字(3)
  3. 导致以下正则表达式:

    1. [^a-z\s]
    2. (^|\s)[a-z]{1,2}(\s|$)
    3. 将这些组合在一起得出:([^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)

您也可以尝试一下,

(?m)^(?=\s*([a-z]{3,}\s*)*$).*

Demo

答案 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