首页 > 解决方案 > 正则表达式:在一个字符串中找到很多模式

问题描述

我有一个字符串

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

期望输出

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

我尝试使用

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

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

我该如何解决这个问题?

标签: pythonregex

解决方案


编辑2:

确保您删除了两个^s 并将前面提到的怪异组更改为非捕获。

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)

请确保您在 python 3+ 中运行它,并且您的正则表达式中没有任何拼写错误。

编辑:

  1. 如前所述,您需要摆脱^模式中的 s 。
  2. 你把它[Пп]ос([её]лок|[Кк]оллективный сад)?变成了一个捕获组,组括号的位置也很奇怪。

我最终得到了这种模式(保持怪异的组但使其不被捕获)。让我知道它是否有效。

原帖:你有一个^字符串字符的开头并且只传递一个字符串。

如果你从这两个地方删除它,你会得到你想要的输出吗?

Regex101 小提琴

此外,根据文档搜索仅查找模式的第一个位置。


推荐阅读