【问题标题】:How can I split a 5 consecutive numeric digits from a string? (Python, Pandas)如何从字符串中拆分 5 个连续的数字? (蟒蛇,熊猫)
【发布时间】:2020-08-30 02:52:08
【问题描述】:

我有以下西班牙地址数据示例,我需要从中提取邮政编码(字符串末尾的 5 个数字):

Carrer Arquebisbe Aspareg, No. 5D, Planta 1, Puerta B, Palma de Mallorca, 07007, Balears, Illes
Avenida de Turruñuelos, No. 1, Bloque Portal 1, Planta 2, Puerta J, Córdoba, 14012, Córdoba
Rua Celso Emilio Ferreiro, No. 38, Planta 1º, Puerta A, Pontes de García Rodríguez, As, 15320, Coruña, A
Calle Del Mayoral, No. 20, Planta 1, Puerta Sin Pta, Zaragoza, 50003, Zaragoza
Calle Trovero Cantares, No. 2, Planta 2DO, Puerta A, Unión, La, 30360, MurciaCamiño Toural De Adentro, No. 24, Planta 1, Puerta IZQ, Vigo, 36207, Pontevedra
Carretera Valencia, No. 41, Planta Bajo, Puerta Izq, Bétera, 46117, Valencia/València
Calle Alcocer, No. 22, Planta 6, Puerta A, Madrid, 28041, Madrid
Carrer Santa Teresa, No. 11, Planta 1, Puerta 4, Cerdanyola del Vallès, 08290, Barcelona
Carrer Esquadres, No. 24 - D, Planta atico, Puerta 5, Hospitalet de Llobregat, L, 08901, Barcelona

我能找到的唯一规则:它总是 5 个连续的数字。它并不总是在倒数第二个索引中(按昏迷划分)。我尝试了以下解决方案:

int(''.join(filter(str.isdigit, my_string)))

但它不起作用,因为我在字符串的开头有其他数字字符(即门牌号)。任何人都可以帮助我吗?非常感谢!

【问题讨论】:

  • 这是字符串还是数据框?
  • 这是一个df,不是一个字符串。

标签: python string pandas split


【解决方案1】:

你需要使用正则表达式。

    import re

    text = """Carrer Arquebisbe Aspareg, No. 5D, Planta 1, Puerta B, Palma de Mallorca, 07007, Balears, Illes
    Avenida de Turruñuelos, No. 1, Bloque Portal 1, Planta 2, Puerta J, Córdoba, 14012, Córdoba
    Rua Celso Emilio Ferreiro, No. 38, Planta 1º, Puerta A, Pontes de García Rodríguez, As, 15320, Coruña, A
    Calle Del Mayoral, No. 20, Planta 1, Puerta Sin Pta, Zaragoza, 50003, Zaragoza
    Calle Trovero Cantares, No. 2, Planta 2DO, Puerta A, Unión, La, 30360, MurciaCamiño Toural De Adentro, No. 24, Planta 1, Puerta IZQ, Vigo, 36207, Pontevedra
    Carretera Valencia, No. 41, Planta Bajo, Puerta Izq, Bétera, 46117, Valencia/València
    Calle Alcocer, No. 22, Planta 6, Puerta A, Madrid, 28041, Madrid
    Carrer Santa Teresa, No. 11, Planta 1, Puerta 4, Cerdanyola del Vallès, 08290, Barcelona
    Carrer Esquadres, No. 24 - D, Planta atico, Puerta 5, Hospitalet de Llobregat, L, 08901, Barcelona"""

    postcodes = re.findall('\d{5}',text)
    print(postcodes)

['07007', '14012', '15320', '50003', '30360', '36207', '46117', '28041', '08290', '08901']

regex 代表正则表达式。一些网站可以帮助您解决问题,例如 https://regexr.com/

【讨论】:

  • 确实,这很有道理。
  • pandas 有在.str. 下使用正则表达式的方法
【解决方案2】:

类似这样的:

addresses = []
for line in input():
  for string in line.split(','):
    if len(string) == 5 and all(char.isdigit() for char in string):
      addresses.append(string)

【讨论】:

    【解决方案3】:

    我认为您正在寻找的是正则表达式。您可能可以将任何长度为 5 的数字与类似的内容匹配:

    postal_codes = re.findall(“\d{5}”, text)
    

    https://docs.python.org/3/library/re.html

    【讨论】:

      【解决方案4】:

      如果 CSV 格式可靠存在,您可以使用 CSV 解析器并提取第六个字段:

      import csv
      csvmode = 'r'
      with open('filename', csvmode) as addrfile:
          cc = csv.reader(addrfile, delimiter=',', quotechar='"')
          for row in cc:
              print (row[5])
      

      但是,在您的示例数据上运行它,似乎存在可变数量的字段,所以这对您来说可能不是一个好的解决方案:

      07007
      Córdoba
      As
      50003
      La
      46117
      28041
      08290
      

      【讨论】:

        猜你喜欢
        • 2019-01-07
        • 2013-09-17
        • 2013-10-19
        • 2018-07-13
        • 2022-01-11
        • 2021-11-09
        • 1970-01-01
        • 2022-01-22
        • 2019-02-12
        相关资源
        最近更新 更多