python - 正则表达式:从字符串中提取所有带有条件的子字符串
问题描述
我有字符串,包含地址
str_addr = '300114 г Тула, Тульская область, Ленинский р-он, п РАССВЕТ, 75, к.34, тульская обл, Краснодарский край, гагарина 38, республика Хакасия'
我需要提取
Тульская, тульская, Краснодарский, Хакасия
我尝试使用
re.findall(r"\b[А-Я]\w*\s+(?:[кК]рай|[оО](бласть|бл))|\b[рР](еспублика|есп)\s+[А-Я]\w*", str_addr)
但我得到一个空列表。
我该如何解决?
解决方案
您可以使用
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])
# => ['Тульская', 'тульская', 'Краснодарский', 'Хакасия']
细节
\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]
列表推导用于在返回的元组列表中删除空值。
推荐阅读
- android - 如何将editText中的字母大写?
- machine-learning - 为什么在 inception 网络中内核大小变大而特征图的空间大小变小?
- r - 使用空格和大写字母拆分字符串
- rsyslog - rsyslog 通过 ssl 流利
- ios - 图像建议不起作用 Xcode 10
- maven - 您可以使用下面的代码片段来实现缺少的步骤
- c# - 如何在 Windows 10 IoT Core for Raspberry PI 3 中从 ASP.NET Core 2.1 调用 UWP 函数
- javascript - React Nouislider - onChange 和 setState 的问题,滑块重置为 0,状态中没有值
- javascript - 按多个字段过滤 Firebase
- node.js - 如何使用soap和nodejs向chronopost发出运输请求