代码之家  ›  专栏  ›  技术社区  ›  Fomalhaut

在Python中,如何通过忽略特定情况的模式提取子字符串?

  •  2
  • Fomalhaut  · 技术社区  · 7 年前

    s = 'qwe rty uio'
    

    我想按模式提取所有条目 [a-z]+ 忽略单词 rty

    pattern = re.compile(r'^(?!rty)[a-z]+')
    result = pattern.findall(s)
    print(result)  # ['qwe']
    

    但它只找到了第一个条目。。。哪种模式是正确的?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Wiktor Stribiżew    7 年前

    提取所有小写ASCII字母的整词,而不是 rty 文字,使用

    r'\b(?!rty\b)[a-z]+'
    

    请参阅 regex demo

    • \b -文字边界
    • (?!rty\b) -如果存在错误,则会导致比赛失败的负面展望 rty公司 紧跟在当前位置右侧的子字符串,后跟一个尾随字边界(如果可以有除小写ASCII字母以外的任何字符,则可以替换此字符) \b (?![a-z]) )
    • [a-z]+ -1个或多个小写ASCII字母。

    下面是一个 Python demo :

    import re
    rx = r"\b(?!rty\b)[a-z]+"
    s = "qwe rty uio"
    print(re.findall(rx, s))
    # => ['qwe', 'uio']
    
        2
  •  0
  •   Jan    7 年前

    对于这个特殊的情况,你甚至不需要前瞻。只需在空白处拆分并使用列表理解:

    import re
    
    s = 'qwe rty uio'
    words = [word for word in re.split(r'\s+', s) if word != 'rty']
    print(words)
    # ['qwe', 'uio']
    

    看见 a demo on ideone.com