确保正则表达式与空字符串不匹配 - 但有一些警告

时间:2018-03-11 18:31:29

标签: regex python-3.x

我需要做一个问题,但有一些注意事项会让它变得困难。

问题:匹配包含最多一个a的字母{abc}上的所有非空字符串。

实施例

  

一个
  ABC
  丰原
  bbcabb

非实例

  

AA
  BBAA

警告:你不能使用前瞻/后视。

我拥有的是:

^[bc]*a?[bc]*$

但它匹配空字符串。也许一个暗示? Idk什么都有帮助

(如果重要的话,我正在使用python)。

4 个答案:

答案 0 :(得分:1)

据我了解你的问题,唯一的问题是,你当前的模式与空字符串匹配。为防止这种情况发生,您可以使用word boundary \b至少需要一个单词字符。

^\b[bc]*a?[bc]*$

See demo at regex101

另一个选项是alternate中的group。从开始到结束匹配任意数量的a或一个或多个[bc]所包围的[bc],如下所示:^(?:[bc]*a[bc]*|[bc]+)$

答案 1 :(得分:0)

我理解这个问题的方式是字母表中的任何字符都应匹配,只有一个 a 字符。

  

匹配所有非空字符串字母 ...最多一个

^[b-z]*a?[b-z]*$

如果可以包含空格:

^([b-z]*\s?)*a?([b-z]*\s?)*$

答案 2 :(得分:0)

你甚至不需要正则表达式,你也可以使用.count()和列表理解:

data = """a,abc,bbca,bbcabb,aa,bbaa,something without the bespoken letter,ooo"""

def filter(string, char):
    return [word 
        for word in string.split(",")
        for c in [word.count(char)]
        if c in [0,1]]

print(filter(data, 'a'))

屈服

['a', 'abc', 'bbca', 'bbcabb', 'something without the bespoken letter', 'ooo']

答案 3 :(得分:0)

你必须积极匹配排除空字符串的东西,
仅使用a,b或c字母。但不能使用断言。

这是你做的。

正则表达式^(?:[bc]*a[bc]*|[bc]+)$

解释

 ^                      # BOS
 (?:                    # Cluster choice
      [bc]* a [bc]*          # only 1 [a] allowed, arbitrary [bc]'s
   |                       # or,
      [bc]+                  # no [a]'s only [bc]'s ( so must be some )
 )                      # End cluster 
 $                      # EOS