代码之家  ›  专栏  ›  技术社区  ›  Petr Petrov

正则表达式:在一个字符串中找到很多模式

  •  0
  • Petr Petrov  · 技术社区  · 6 年前

    деревня Лесное, деревня Пальмово, село Поляково, город Стерлитамак
    

    ['деревня Лесное', 'деревня Пальмово', 'село Поляково']
    

    我试着用

    villages_compiler = re.compile(r"""\b^(?:[Дд]еревня|[Сс]ело|[Рр]азъезд|[ДдСсПпХх]|[Сс]т|[Дд]ер|[Пп]ос([её]лок|[Кк]оллективный сад)?|[Пп]гт|[Рр]\.?\s?[Пп]|[Сc]адовое товарищество|ДНП|ДНТ|ДПК|ДТ|ЖК|СТ|СНТ|СПК|СО|СК)(?:\.|\s|\.\s)(?:\«?|\"?)[\w\s\.-]+(?:\»?|\"?)""" \
                                   r"""|\b^[\w\s-]+(?:[Сс]ельсовет|[Шш]оссе)""")
    re.findall(villages_compiler, "деревня Лесное, деревня Пальмово, село Поляково, город Стерлитамак")
    

    但它返回一个空列表。 当我改变的时候 findall() search() 我只得到 деревня Лесное

    我怎样才能解决那个问题?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Chillie    6 年前

    编辑2:

    确保两个都已删除 ^ 你把之前提到的奇怪的组改成了不捕捉。

    s = 'деревня Лесное, деревня Пальмово, село Поляково, город Стерлитамак'
    expr = r'\b(?:[Дд]еревня|[Сс]ело|[Рр]азъезд|[ДдСсПпХх]|[Сс]т|[Дд]ер|[Пп]ос(?:[её]лок|[Кк]оллективный сад)?|[Пп]гт|[Рр]\.?\s?[Пп]|[Сc]адовое товарищество|ДНП|ДНТ|ДПК|ДТ|ЖК|СТ|СНТ|СПК|СО|СК)(?:\.|\s|\.\s)(?:\«?|\"?)[\w\s\.-]+(?:\»?|\"?)|\b[\w\s-]+(?:[Сс]ельсовет|[Шш]оссе)'
    
    re.findall(expr, s)
    

    在python 3.6中提供以下输出:

    ['деревня Лесное', 'деревня Пальмово', 'село Поляково']
    

    与相同

    comp = re.compile(expr)
    comp.findall(s)
    

    编辑:

    1. ^ 这是你的模式。
    2. 这是你做的 [Пп]ос([её]лок|[Кк]оллективный сад)?

    我最终得到了 this pattern (保留奇怪的组,但使其不被捕获)。让我知道它是否有效。

    你有一个 ^ 字符串的开头字符,只传递一个字符串。

    Regex101 fiddle

    也, as per docs 搜索只查找模式的第一个位置。

        2
  •  0
  •   U13-Forward    6 年前

    findall 属于 villages_compiler ,所以:

    villages_compiler.findall(your_string)