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

2024-06-17 11:43:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有字符串,包含地址

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

我需要提取

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

我试着用

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

但我得到一张空名单

我该怎么修


Tags: 字符串re地址addr名单strfindall
1条回答
网友
1楼 · 发布于 2024-06-17 11:43:01

你可以用

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

相关问题 更多 >