【问题标题】:Fast way to split alpha and numeric chars in a python string在 python 字符串中拆分字母和数字字符的快速方法
【发布时间】:2012-09-13 15:35:42
【问题描述】:

我正在尝试制定一个简单的函数来捕获拼写错误,例如:

"Westminister15"
"Westminister15London"
"23Westminister15London"

固定后:

["Westminister", "15"]
["Westminister", "15", "London"]
["23", "Westminister", "15", "London"]

第一次尝试:

 def fixate(query):
     digit_pattern = re.compile(r'\D')
     alpha_pattern = re.compile(r'\d')
     digits = filter(None, digit_pattern.split(query))
     alphas = filter(None, alpha_pattern.split(query))
     print digits
     print alphas

结果:

 fixate("Westminister15London")

 > ['15']
 > ['Westminister', 'London']

但是,我认为这可以更有效地完成,当我尝试以下方法时仍然会得到不好的结果:

 fixate("Westminister15London England")

 > ['15']
 > ['Westminister', 'London England']

显然它应该分别加入 LondonEngland,但我觉得我的函数会被过度修补,并且有一个更简单的方法

这个问题有点相当于thisphp问题

【问题讨论】:

    标签: python regex


    【解决方案1】:

    问题在于 Python 的 re.split() 不会在零长度匹配上进行拆分。但是你可以通过re.findall()得到想要的结果:

    >>> re.findall(r"[^\W\d_]+|\d+", "23Westminister15London")
    ['23', 'Westminister', '15', 'London']
    >>> re.findall(r"[^\W\d_]+|\d+", "Westminister15London England")
    ['Westminister', '15', 'London', 'England']
    

    \d+ 匹配任意位数,[^\W\d_]+ 匹配任意单词。

    【讨论】:

      【解决方案2】:

      这是另一种方法,以防您更喜欢远离正则表达式,如果一个人不够熟悉而无法自己制作/更改它,有时可能会很笨拙:

      from itertools import groupby
      
      def split_text(s):
          for k, g in groupby(s, str.isalpha):
              yield ''.join(g)
      
      print(list(split_text("Westminister15")))
      print(list(split_text("Westminister15London")))
      print(list(split_text("23Westminister15London")))
      print(list(split_text("Westminister15London England")))
      

      返回:

      ['Westminister', '15']
      ['Westminister', '15', 'London']
      ['23', 'Westminister', '15', 'London']
      ['Westminister', '15', 'London', ' ', 'England']
      

      生成器也可以很容易地修改,如果需要的话,永远不会产生空白字符串。

      【讨论】:

        【解决方案3】:

        您可以使用此正则表达式代替您的:

        >>> import re
        >>> regex = re.compile(r'(\d+|\s+)')
        >>> regex.split('Westminister15')
        ['Westminister', '15', '']
        >>> regex.split('Westminister15London England')
        ['Westminister', '15', 'London', ' ', 'England']
        >>> 
        

        然后您必须过滤列表以删除空字符串/仅包含空格的字符串。

        【讨论】:

          猜你喜欢
          • 2019-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-12
          相关资源
          最近更新 更多