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



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

...
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)",但只需要第一个代码

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

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

模式也应该在单词边界上开始和结束,这样就不会去掉下一个单词开头的大写字母。

import re
re.sub(r'b[A-Zd ]*d[A-Zd ]*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

注意:如果某些代码不包含任何数字,那么您可以用(d|[A-Z]{2})替换中间的d,这样,如果它同时包含两个大写字母,也就足够了。您不希望将单个大写字母视为代码,例如A Coruña

第一步是创建一个规则,指定要提取的有效城市名称的组成部分,或者要转换为空字符串的不属于城市名称的字符串的组成部分。我会做后者,主要是因为必须匹配Unicode字符(例如"Tucumán"(带来了复杂性。

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

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

启动发动机!

链接处的"替换"框为空。

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

相关内容

最新更新