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

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

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

    我有字符串,包含地址

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

    我需要提取

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

    我试着用

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

    但我得到一个空名单。

    我该怎么解决?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Wiktor Stribiżew    6 年前

    你可以用

    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_]*) 以下内容:
      • \乙 -词边界
      • [рР]есп(?:ублика)? - Республика / Респ 有变化的
      • \ S公司+ -1+空格
      • ([_-___''-_][^\W\D]*) -第1组:一个俄文字母,后跟0+个字母
    • | -或者
    • ([мМ]осква|[сС]анкт-Петербург) -第3组: Москва Санкт-Петербург 是的。

    这个 ["".join(x) for x in res] 列表理解用于将空值放入返回的元组列表中。