正则表达式:从字符串中提取所有带有条件的子字符串

时间:2018-07-05 14:04:09

标签: python regex

我有字符串,包含地址

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

我需要提取

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

我尝试使用

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

但是我得到一个空列表。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

您可以使用

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 demo

详细信息

  • \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]列表理解用于将空值放入返回的元组列表中。