代码之家  ›  专栏  ›  技术社区  ›  Feng Chen

如何定义类似regex的:包括字母和(),但不包括。和使用python的数字

  •  2
  • Feng Chen  · 技术社区  · 6 年前

    我刚开始使用python进行regex。现在我有个问题,比如:

    myTry=['a bb Aas','aa 1 Aasdf','aa bb (cc) AA','aaa ASD','aa . ASD','aaaa 1 bb Aas']
    

    我想找到的是在大写字母之前的子字符串(本例中为a),它可以包含多个单词和(),但不包括数字和..因此,在本例中,应检测mytry中的以下字符串:

    'a bb Aas'
    'aa bb (cc) AA'
    'aaa ASD'
    

    结果应该是:

    'a bb'
    'aa bb (cc)'
    'aaa'
    

    我不知道使用regex来定义类似“同时包含和排除某些内容”的模式。

    尤其是第一个和最后一个字符串:“a bb aas”和“aaaa 1 bb aas”。我想要第一个,不想要第二个。但我不知道这些单词中会有多少个单词和多少个数字。但只要有数字和。在首都之前,我不需要它们。

    有人能帮我吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   ggorlen Hoàng Huy Khánh    6 年前

    您可以使用两个regex操作。第一个通过匹配 ^[a-zA-Z\s\(\)]*$ ,然后第二个使用正向先行收集所需子字符串: .*?(?= [A-Z]) .

    import re
    
    my_try = ['a bb Aas','aa 1 Aasdf','aa bb (cc) AA','aaa ASD','aa . ASD','aaaa 1 bb Aas']
    filtered = [x for x in my_try if re.match(r'^[a-zA-Z\s\(\)]*$', x)]
    result = [re.match(r'.*?(?= [A-Z])', x).group(0) for x in filtered]
    
    print(result) # => ['a bb', 'aa bb (cc)', 'aaa']
    

    如果预期某些字符串可能会通过筛选(即,包含除字母字符、括号或空格之外的其他内容),但可能与lookahead不匹配,则需要筛选中间结果:

    import re
    
    my_try = ['a bb Aas','aaa ASD','aa . ASD','aaaa 1 bb Aas', '']
    #                                                          ^^ could cause problems
    filtered = [x for x in my_try if re.match(r'^[a-zA-Z\s\(\)]*$', x)]
    matches = [re.match(r'.*?(?= [A-Z])', x) for x in filtered]
    result = [x.group(0) for x in matches if x]
    
    print(result) # => ['a bb', 'aaa']
    
        2
  •  2
  •   furas    6 年前

    如果您将包括字母()和空格,那么它将自动排除其他元素。

    import re
    
    myTry = ['aa bb Aas','aa 1 Aasdf','aa bb (cc) AA','aa ASD','aa . ASD']
    
    for item in myTry:
        if re.match('[a-z() ]*A', item):
            print(item)
    
    推荐文章