【问题标题】:Python Splitting string by number and spacePython按数字和空格分割字符串
【发布时间】:2016-02-08 17:55:51
【问题描述】:

嗨,有人能帮帮我吗?我有很多包含地址的字符串,我需要将它们拆分以获取街道名称、门牌号和国家/地区。

类似这样的:

streetA 15, New York
street number 2 35, California
streetB 36B, Texas

进入:

['streetA','15','New York']
['street number 2','35','California']
['streetB','36B','Texas']

谢谢。

【问题讨论】:

    标签: python arrays string split strsplit


    【解决方案1】:

    你不需要使用re.compile():

    import re
    
    def splitup(string):
        match = re.search(" \\d[^ ]*, ", string)
        if match is None:
            raise ValueError("Not a valid string: %r" % string)
        street = string[:match.start()]
        number = string[match.start(): match.end()].strip(", ")
        state = string[match.end():]
        return [street, number, state]
    

    对于您的示例,它会打印:

    ['streetA', '15', 'New York']
    ['street number 2', '35', 'California']
    ['streetB', '36B', 'Texas']
    

    【讨论】:

      【解决方案2】:

      只需使用.split(',') 获取国家(最后一项),然后在第一项中找到最后一个空格:

      >>> l = 'street number 2 35, California'.split(',')
      >>> index = l[0].rfind(' ')
      >>> l = [l[0][:index]] + [l[0][index+1:]]+ [l[1].strip()]
      >>> l
      ['street number 2', '35', 'California']
      

      【讨论】:

      • 我认为这不适用于第二个项目——“加利福尼亚州 2 35 号街道”
      • @WoLy 这会在列表中最后一项的开头留下一个空格。试试这个:l =[l[0][:i]] + [l[0][i+1:]] + [l[1].strip()].
      • @Gabriel 谢谢。
      【解决方案3】:

      @Brendan Abel 解决方案很好,虽然它返回的是元组而不是列表。

      您可以使用list() 函数将其转换为列表,这将匹配您的输出:

      import re
      
      regex = re.compile(r'^(.+) (\d+\w*), (.+)$')
      
      m = regex.match('streetA 15, New York')
      result=list(m.groups())
      print result
      # ['streetA', '15', 'New York']
      

      【讨论】:

      • 为什么投反对票? OP 说“我需要拆分它们以获取街道名称、门牌号和国家/地区。”。
      • 我没有投反对票,但我想这是因为 Brendan 已经发布了您的答案。
      • 确实我没有说“这就是我的答案”,只是 Brendan 的代码返回的是一个元组而不是一个列表,这就是 OP 想要的。这太荒谬了。
      • 有些人对否决票非常满意。这是给你的 +1。
      【解决方案4】:

      你可以使用正则表达式。

      import re
      
      regex = re.compile(r'^(.+) (\d+\w*), (.+)$')
      
      m = regex.match('streetA 15, New York')
      print m.groups()
      # ('streetA', '15', 'New York')
      
      m = regex.match('street number 2 35, California')
      print m.groups()
      # ('street number 2', '35', 'California')
      

      这是example on regex101

      【讨论】:

      • 我认为正则表达式是矫枉过正,因为 split() 可以满足需要。
      • @Gabriel 对于字符串解析,正则表达式往往更加清晰和自我记录。您可以为组添加标签以使其更加清晰,并且所有解析都可以在一行代码中一步完成。看看.split() 代码,直观地解析代码的意图有多困难。增加更多的解析需求,即使是很小的,只会增加复杂度,而正则表达式仍然可以维护一行代码。
      • 对我来说,正则表达式比使用内置 Pyhton 函数复杂得多。一行代码可以很简洁,但仍然非常复杂。
      猜你喜欢
      • 2013-10-11
      • 2021-10-05
      • 1970-01-01
      • 2018-03-22
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      相关资源
      最近更新 更多