首页 > 解决方案 > 正则表达式:从字符串中提取所有带有条件的子字符串

问题描述

我有字符串,包含地址

str_addr = '300114 г Тула, Тульская область, Ленинский р-он, п РАССВЕТ, 75, к.34, тульская обл, Краснодарский край, гагарина 38, республика Хакасия'

我需要提取

Тульская, тульская, Краснодарский, Хакасия

我尝试使用

re.findall(r"\b[А-Я]\w*\s+(?:[кК]рай|[оО](бласть|бл))|\b[рР](еспублика|есп)\s+[А-Я]\w*", str_addr)

但我得到一个空列表。

我该如何解决?

标签: pythonregex

解决方案


您可以使用

import re
str_addr = '300114 г Тула, Тульская область, Ленинский р-он, п РАССВЕТ, 75, к.34, тульская обл, Краснодарский край, гагарина 38, республика Хакасия Москва, Санкт-Петербург'
res = re.findall(r"\b([А-Яа-яёЁ][^\W\d_]*)\s+(?:[кК]рай|[оО]бл(?:асть)?)|\b[рР]есп(?:ублика)?\s+([А-Яа-яёЁ][^\W\d_]*)|([мМ]осква|[сС]анкт-Петербург)", str_addr)
print(["".join(x) for x in res])
# => ['Тульская', 'тульская', 'Краснодарский', 'Хакасия']

查看Python 3 演示

细节

  • \b([А-Яа-яёЁ][^\W\d_]*)\s+(?:[кК]рай|[оО]бл(?:асть)?)
    • \b- 单词边界
    • ([А-Яа-яёЁ][^\W\d_]*)- 第 1 组:一个俄语字母后跟任何 0+ 个字母
    • \s+- 1+ 空格
    • (?:[кК]рай|[оО]бл(?:асть)?)- Край, край, область, Область, обл,Обл
  • |- 或者
  • \b[рР]есп(?:ублика)?\s+([А-Яа-яёЁ][^\W\d_]*)
    • \b- 单词边界
    • [рР]есп(?:ублика)?- Республика/Респ有变化
    • \s+- 1+ 空格
    • ([А-Яа-яёЁ][^\W\d_]*)- 第 1 组:一个俄语字母后跟任何 0+ 个字母
  • |- 或者
  • ([мМ]осква|[сС]анкт-Петербург)- 第 3 组:МоскваСанкт-Петербург

["".join(x) for x in res]列表推导用于在返回的元组列表中删除空值。


推荐阅读