删除数字及其后面的任何特殊字符或字母(从邮政地址)



我正在尝试从地址中删除街道号码,例如大街 30 号。

简单的工作正常:

# remove numbers, strip remaining white space at left
re.sub(r'[0-9]+', '', '30 Main Street').lstrip()
'Main Street'

但是,有些数字上附加了字母或逗号,例如

30B Main Street30b, Main Street"大街30号">

我正在尝试包含附加到数字的逗号或字母。它的工作原理:

re.sub(r'[0-9]+w,', '', '30b, Main Street').lstrip()
'Main Street'

但现在它不适用于原始的简单地址:

re.sub(r'[0-9]+w,', '', '30 Main Street').lstrip()
'30 Main Street'

我尝试按照一些教程的建议使用|向正则表达式添加"or",但现在这没有检测到任何字母:

re.sub(r'[0-9]+|[0-9]+w,', '', '30b, Main Street').lstrip()
'b, Main Street'

任何建议不胜感激。

您可以为字母或逗号指定可选字符类:

import re
pat = re.compile(r'bd+[a-z,]*s*', re.I)
print(pat.sub('', '30b, Main Street'))   # Main Street
print(pat.sub('', '30 Main Street'))     # Main Street

  • [a-z,]*- 匹配零个或多个出现的字母a-z或逗号,
  • s*- 匹配零个或多次出现的空格字符s(因此您无需在之后.lstrip()(

如果您尝试匹配附加到数字的逗号或字母,则可以使用可选的字符 a-zA-Z 并匹配可选的逗号:

b[0-9]+[a-zA-Z]*,?s*

解释

  • b[0-9]+匹配前面带有单词边界的 1+ 位数字,防止数字成为较大单词的一部分
  • [a-zA-Z]*匹配 0+ 字符 a-zA-Z
  • ,?s*匹配可选的逗号和0+空格字符

正则表达式演示 |蟒蛇演示

import re
strings = [
"30B Main Street",
"30b, Main Street",
"30, Main Street",
"10 foobar street"
]
for s in strings:
print(re.sub(r'b[0-9]+[a-zA-Z]*,?s*', '', s)) 

结果

Main Street
Main Street
Main Street
foobar street

我建议先删除数字,就好像原来一样,然后使用第二行代码将逗号替换为空格,最后修剪任何空格。不是最优雅的解决方案,但非常简单且有效(至少在PHP中确实如此(。希望这有帮助!

最新更新