【问题标题】:Get n Characters from String specified in python [closed]从python中指定的字符串中获取n个字符[关闭]
【发布时间】:2021-10-28 15:26:47
【问题描述】:

让 s = "%2ABCDE" - 从字符串中获取前 2 个字符 那么输出应该是“AB”。 需要从字符串中由数字指定的字符串中获取字符。 例如。 s1="%12ABCDERTYUIOPLKHGF" - 从字符串中获取前 12 个字符。

我尝试使用 re.findall('\d+', string ) 获取数字,但如果我的字符串为“%2ABCD1”,则会出现问题。 请推荐

【问题讨论】:

  • 你想在得到 AB 字符之前从头开始去掉非字母字符?
  • 到目前为止你尝试了什么?
  • 我试过 re.findall('\d+', string ),但这只返回单个数字。
  • @user892077 请在问题中包含您尝试过的内容。
  • @JoshuaVoskamp 正确,正如我所说,我认为将 2 替换为 int(re.findall('\d+', s1)[0]) 是不言自明的,因此解决方案是 ''.join(re.findall('[A-Za-z]', s1)[:int(re.findall('\d+', s1)[0])])

标签: python python-3.x string


【解决方案1】:
s = "%2ABCDE"
number = ""
offset = 0
for i in range(len(s)):
    if s[i] == "%":
        continue
    elif s[i].isdigit():
        number += s[i]
    else:
        offset = i
        break

print(s[offset:int(number) + offset])

输出:AB

【讨论】:

    【解决方案2】:

    执行此操作的更简单方法是执行以下操作:

    txt = "%2ABCDE"
    number_list = [s for s in txt if s.isdigit()]
    number_concate = int("".join(number_list))
    txt_filtered = txt[len(number_list)+1:]
    print(txt_filtered[:number_concate])
    

    为字符串 "%2ABCDE" 输出 AB

    为字符串 "%12ABCDERTYUIOPLKHGF" 输出 ABCDERTYUIOP

    您正在获取字符串,如果数字存在,则对字符串进行列表理解,然后加入列表并将其更改为整数,以便您相应地过滤字符串。然后将字符串剥离为仅字符,然后打印出答案。

    【讨论】:

    • 但是如果字符串是“%2ABCD1”,这个不起作用(请看question)。
    【解决方案3】:
    import re
    s = '%2ABCDERTYUIOPLKHGF'
    numeral_instruction = re.search(r'%\d+',s).group(0)
    start = len(numeral_instruction)
    stop = start + int(numeral_instruction[1:])
    s[start:stop]
    

    输出

    AB
    

    【讨论】:

      【解决方案4】:

      您可以获取字符串中第一个非数字字符的位置(跳过 %),并以此为基础获取长度并形成子字符串:

      s1="%12ABCDERTYUIOPLKHGF"
      
      i = next(i for i,c in enumerate(s1[1:],1) if not c.isdigit())
      result = s1[i:i+int(s1[1:i])]
      
      print(result)
      ABCDERTYUIOP
      

      如果字符串中的第一个数字并不总是在索引 1 处,您可以使用相同的技术跳过可变数量的字符:

      s1="*:%12ABCDERTYUIOPLKHGF"
      
      start = next(i for i,c in enumerate(s1) if c.isdigit())           
      end   = next(i for i,c in enumerate(s1[start:],start) if not c.isdigit())
      result = s1[end:end+int(s1[start:end])]
      
      print(result)
      ABCDERTYUIOP
      

      如果要使用re模块,只需要第一次出现的数字,所以用re.search()代替re.findall():

      import re
      m      = re.search(r"\d+",s1)
      result = s1[m.end():m.end()+int(m.group())]
      
      print(result)
      ABCDERTYUIOP
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-20
        • 2018-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多