python2.7模式匹配单词

时间:2014-01-15 18:45:09

标签: python-2.7

Python 2.7 我想搜索一个具有'01'或'10'模式的单词,无论单词的长度如何。 如果模式是其他任何东西,那么它不是我想要的模式: 例如:

10 - Yes
01 - Yes
001 - No  
10101010 – Yes
1001000 – No
11010111 – No
1010110101011 -No

我正在看正则表达式。但是我只看到给定的固定长度模式的匹配。我希望匹配单词长度未知的整个单词。

1 个答案:

答案 0 :(得分:2)

此代码将查找偶数位置中没有任何字符出现在奇数位置的字符串。对于01(或任何两个字符)的2个字符的字母表,这将捕获长度至少为2且交替的字符串。

def is_alternating(string):
    if len(string) < 2:
        return False
    evens = string[::2]
    odds = string[1::2]
    # if the sets aren't disjoint, then at least one character appears at
    # both even and odd positions -> not an alternating string
    if set.isdisjoint(set(evens), set(odds)):
        return True
    else:
        return False

words = ['10', '01', '001', '10101010', '1001000', '11010111', '1010110101011']
results = list(map(is_alternating, words))
for thing in zip(results, words):
    print(thing)

结果:

(True, '10')
(True, '01')
(False, '001')
(True, '10101010')
(False, '1001000')
(False, '11010111')
(False, '1010110101011')

以下解决方案对应的规格与OP似乎不同。

>>> import re
>>> words = ['10', '01', '001', '10101010', '1001000', '11010111', '1010110101011']
>>> results = [bool(re.match('^((01)+|(10)+)$', w)) for w in words]
>>> for e in zip(results, words):
    print(e)

(True, '10')
(True, '01')
(False, '001')
(True, '10101010')
(False, '1001000')
(False, '11010111')
(False, '1010110101011')

我认为这会复制您想要的行为。严格地由一个或多个0110重复组成的字符串(但不是这两个的混合)匹配。