【问题标题】:how to extract letters and numbers with above 90% from a string?如何从字符串中提取90%以上的字母和数字?
【发布时间】:2021-08-30 01:43:05
【问题描述】:

这是我的代码:

S='MOL MAGYAR OLAJ-ES GAZIPARI RT (95%); MERRILL LYNCH & CO INC (91%); CITIGROUP INC (83%);' 
lst = re.findall('\S+[9]\S+', S)
lst

我的代码应该返回一个包含 90% 以上的字母和百分比的字符串,在我的示例中它不应该返回 CITIGROUP INC (83%);

我的输出: 我只能返回 90 以上的百分比,但不能返回字母。

['(95%);', '(91%);']

我的预期输出:

MOL MAGYAR OLAJ-ES GAZIPARI RT (95%); MERRILL LYNCH & CO INC (91%);

【问题讨论】:

    标签: python regex string


    【解决方案1】:

    \S 只匹配非空格,并且由于您在百分比之前有空格,它不会匹配它们。

    解决此问题的一种方法是匹配任何内容,直到您得到一个括号,后跟一个以 9 开​​头的百分比,然后是 [0-9]\d 之一:

    lst = re.findall('.+?\(9\d%\);', S)

    但是,如果您想制作更复杂的逻辑,我建议您使用匹配和捕获组

    示例:

    import re
    
    
    S='MOL MAGYAR OLAJ-ES GAZIPARI RT (95%); MERRILL LYNCH & CO INC (91%); CITIGROUP INC (83%);'
    lst = re.finditer('.+?\((\d+)%\);', S)
    
    for item in lst:
        if int(item[1]) > 90:
            print(item[0])
    

    【讨论】:

      【解决方案2】:

      你可以试试:

      import re
      
      S='MOL MAGYAR OLAJ-ES GAZIPARI RT (95%); MERRILL LYNCH & CO INC (91%); CITIGROUP INC (83%);'
      lst = re.findall(r'.*? \((?:9\d|[1-9]\d{2,})%\);', S)
      

      它给出:

      ['MOL MAGYAR OLAJ-ES GAZIPARI RT (95%);', ' MERRILL LYNCH & CO INC (91%);']
      

      如果要将结果连接成单个字符串,则可以添加

      ''.join(lst)
      

      它会给出:

      'MOL MAGYAR OLAJ-ES GAZIPARI RT (95%); MERRILL LYNCH & CO INC (91%);'
      

      【讨论】:

      • 我认为它也应该接受100%?甚至更高?
      • @HaoWu 好点。现在它将接受任何更高的数字。
      【解决方案3】:

      试试:

      S='MOL MAGYAR OLAJ-ES GAZIPARI RT (95%); MERRILL LYNCH & CO INC (91%); CITIGROUP INC (83%); ANOTHER (100%)' 
      out = []
      for s in S.split(';'):
          s = s.strip()
          if re.search(r'\(9[0-9]%|\(1[0-9]{2}%', s):
              out.append(s)
              
      print(out)
      print('; '.join(out))
      

      输出:

      # list
      ['MOL MAGYAR OLAJ-ES GAZIPARI RT (95%)', 'MERRILL LYNCH & CO INC (91%)', 'ANOTHER (100%)']
      
      # string
      MOL MAGYAR OLAJ-ES GAZIPARI RT (95%); MERRILL LYNCH & CO INC (91%); ANOTHER (100%)
      

      【讨论】:

        【解决方案4】:

        ;分割字符串,如果超过90%则解析数值。

        • 可以读取超过 100% 的百分比
        • 可以读取正百分比和负百分比
        • 可以读取小数点值
        S = 'MOL MAGYAR OLAJ-ES GAZIPARI RT (95%); MERRILL LYNCH & CO INC (91%); CITIGROUP INC (83%); ABCDE CORP (200%); DEFG HI (19%); DEFG HI (-96%); JK LMN (90.12%);'
        
        def is_above_90(text):
            if not text.strip():
                return False
            start = text.rindex('(') + 1
            end = text.rindex('%')
            num = text[start:end]
            return float(num) >= 90
        
        s_splits = S.split(';')
        s_splits_filtered = filter(is_above_90, s_splits)
        S_filtered = ";".join(s_splits_filtered)
        
        print(S_filtered)
        
        MOL MAGYAR OLAJ-ES GAZIPARI RT (95%); MERRILL LYNCH & CO INC (91%); ABCDE CORP (200%); JK LMN (90.12%)
        

        【讨论】:

          猜你喜欢
          • 2017-07-30
          • 2021-12-10
          • 2018-12-13
          • 2016-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-11
          • 2010-10-18
          相关资源
          最近更新 更多