使用正则表达式从城市名称中删除代码

2024-05-13 03:50:50 发布

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

我需要找到一个正则表达式,它能够通过删除城市代码和保留城市名称来清理输入

...
1105 AZ Amsterdam
AB25 2ZN Aberdeen
SY3 8XQ Shrewsbury
2XU Edinburh
NP20 2UB Newport
T4000 DGI San Miguel de Tucumán
BL9 7TD Lancashire
M13 9WL Manchester
L1H 7K4 Oshawa
...

预期产出:

...
Amsterdam
Aberdeen
Shrewsbury
Edinburgh
Newport
San Miguel de Tucumán
Lancashire
Manchester
Oshawa
...

我尝试了r"([0-9-]+\b)|([A-Z]+[0-9-]+\b)",但只需要第一个代码


Tags: 代码名称deazsannewportamsterdamaberdeen
2条回答

第一步是创建一个规则,指定哪些内容构成要提取的有效城市名称,或者哪些内容构成不属于城市名称的字符串,并将其转换为空字符串。我将使用后者,主要是因为必须匹配Unicode字符(例如,“Tucumán”)所带来的复杂性

开头要删除的部分似乎由一个或多个子字符串组成,每个子字符串由两个或多个大写字母或数字组成,后跟一个或多个空格。我们可以将其与以下正则表达式匹配

r'^(?:[A-Z0-9]{2,} +)+'

Start your engine!

链接处的替换框为空

Python的正则表达式引擎执行以下操作

^                 : match beginnning of the string
(?:               : begin a non-capture group
  [A-Z0-9]{2,} +  : match 2+ uppercase letters or digits followed by 1+ spaces
)                 : end non-capture group
+                 : execute non-capture group 1+ times

这里的困难在于,您希望匹配一系列大写字母、数字或空格,但不希望仅匹配一个空格,而且可能不希望匹配任何不包含任何数字的内容

虽然可能有一种更简单的形式,但有一件事是可行的,那个就是坚持要有一个数字,前后都有任意数量的其他字符

该模式还应在单词边界上开始和结束,以便不会在下一个单词的开头去掉大写字母

import re

re.sub(r'\b[A-Z\d ]*\d[A-Z\d ]*\b', '', address)

问题中示例的输出:

Amsterdam
Aberdeen
Shrewsbury
Edinburh
Newport
San Miguel de Tucumán
Lancashire
Manchester
Oshawa

注释中其他地方提到的20007 Washington的输出:

Washington

发明一个在末尾有代码的示例,即:

Some other address SW1A 1AA

它给出:

Some other address

注意:如果一些代码不包含任何数字,那么您可以做的是用^ {< CD3>}在中间替换^ {< CD2>},这样,如果它包含了两个EEE>大写字母,就足够了。您不希望将单个大写字母视为代码,例如A Coruña

相关问题 更多 >