如何从字符串中找到不重复的单词?

2024-06-16 13:12:52 发布

您现在位置:Python中文网/ 问答频道 /正文

单词有元音字母和辅音字母

  • 不应该有两个元音在一起

  • 不应该有两个共犯在一起

  • “z”是该规则的一个例外。z可以一起重复

例如,“人”是真的,“国王”,“马”是假的,“zzzz”是真的

代码

input_str1 = 'man'
input_str2 = 'king'
input_str3 = 'zzzz'
input_str4 = 'horse'
test_list = [chr(x) for x in range(ord('a'), ord('z') + 1)] 
vowels = ['a','e','i','o','u']

测试列表有完整的字母表


Tags: 代码input规则字母单词元音国王man
2条回答

无正则表达式解决方案:

   vowels = ['a','e','i','o','u']
    def check_st(st):
        v, c = 0, 0
        for i in st:
            if i in vowels:
                if v:
                    return False
                v, c = 1, 0
            elif i == 'z':
                continue
            else:
                if c:
                    return False
                v, c = 0, 1
        return True

v代表元音,c代表辅音

  • 如果你有v,那么v=1,c=0
  • 如果您有z,那么我们不在乎>;移动到下一个迭代
  • 否则它必须是c,那么:v=0和c=1

然后在下一次迭代中,我们将确保它不是相同的类型(v或c)

请注意:

如果“z”是“顺序断路器”,则应指定:

    elif i == 'z':
        v, c = 0, 0

在python中,可以将此正则表达式与两个负lookahead一起使用:

^(?i)(?!.*[aeiou]{2})(?!.*[^aeiouz]{2})[a-z]+$

RegEx Demo

正则表达式详细信息

  • ^:开始
  • (?i):启用大小写忽略匹配
  • (?!.*[aeiou]{2}):如果我们同时有两个元音,那么负前瞻将使匹配失败
  • (?!.*[^aeiouz]{2}):如果我们有两个辅音在一起,负前瞻将使匹配失败
  • [a-z]+:匹配1+个英文字母
  • $:结束

在Python使用中:

>>> import re
>>> rx = re.compile(r'^(?!.*[aeiou]{2})(?!.*[^aeiouz]{2})[a-z]+$', re.I)
>>> arr = ['man', 'king', 'horse', 'zzzz']
>>> [s for s in arr if rx.search(s)]
['man', 'zzzz']

相关问题 更多 >