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

时间:2018-09-20 10:12:42

标签: python regex

我有一个字符串

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

期望输出

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

我尝试使用

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

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

如何解决该问题?

2 个答案:

答案 0 :(得分:1)

Edit2:

确保从中删除了两个^,并将前面提到的怪异组更改为不捕获。

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. 如前所述,您需要摆脱模式中的^
  2. 您将此[Пп]ос([её]лок|[Кк]оллективный сад)?设置为捕获组,并且该组括号的位置也显得很奇怪。

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

原始帖子: 您有一个^字符串字符的开头,并且仅传递了一个字符串。

如果从两个地方都将其删除,会得到所需的输出吗?

Regex101 fiddle

此外,as per docs搜索仅查找图案的第一个位置。

答案 1 :(得分:0)

就像@nhahtdh所说的那样,有一种findall的方法villages_compiler,所以:

villages_compiler.findall(your_string)