【问题标题】:Python regex find single digit if no digits before it如果之前没有数字,Python 正则表达式会找到单个数字
【发布时间】:2021-04-06 11:18:19
【问题描述】:

我有一个字符串列表,如果前面没有数字,我想使用正则表达式来获取单个数字。

strings = ['5.8 GHz', '5 GHz']

for s in strings:
    print(re.findall(r'\d\s[GM]?Hz', s))

# output
['8 GHz']
['5 GHz']

# desired output
['5 GHz']

我希望它只返回“5 GHz”,第一个字符串不应该有任何匹配项。如何修改我的模式以获得所需的输出?

【问题讨论】:

  • 您的意思是要在模式的开头包含“^”吗?在第一个“s”上有效地输出一个空列表。
  • 不,因为我还有其他以其他字符和句子开头的字符串,所以我需要一个通用的解决方案
  • 也许在您的样本中反映这种类型的数据是明智的。看看你现在写的东西,你可以看到r'(?<!\d\.)\d+\s[GM]?Hz' 是否成功了?
  • 这也可以,但你能解释一下为什么第一位在括号里吗?
  • 效果很好!如果您将其发布为答案,我会接受它

标签: python python-3.x regex


【解决方案1】:

根据我的评论,您似乎可以使用:

(?<!\d\.)\d+\s[GM]?Hz\b

这匹配:

  • (?&lt;!\d\.) - 在任何单个数字和文字点之后都不正确地断言位置的否定回溯。
  • \d+ - 1+ 个数字与频率的整数部分匹配。
  • [GM]?Hz - 可选的大写 G 或 M,后跟“Hz”。
  • \b - 单词边界。

【讨论】:

    【解决方案2】:
    >>> strings = ['5.8 GHz', '5 GHz']
    >>> 
    >>> for s in strings:
    ...     match = re.match(r'^[^0-9]*([0-9] [GM]Hz)', s)
    ...     if match:
    ...         print(match.group(1))
    ... 
    5 GHz
    

    【讨论】:

      【解决方案3】:

      更新答案

      import re
      a = ['5.8 GHz', '5 GHz', '8 GHz', '1.2', '1.2 Some Random String', '1 Some String', '1 MHz of frequency', '2 Some String in Between MHz']
      res = []
      for fr in a:
          if re.match('^[0-9](?=.[^0-9])(\s)[GM]Hz$', fr):
              res.append(fr)
      print(res)
      

      输出: ['5 GHz', '8 GHz']

      【讨论】:

      • 这行得通,但有时我会遇到数字后面不仅仅是“GHz”的情况,所以模式应该包括“GHz”。你可以编辑你的模式来专门寻找这个吗?
      • 你是说GHz也应该匹配,因为你的列表也可能是['5.8 GHz', '5 GHz', '8 GHz', '1.2', '4.5 Some_Random_Text'],其中你只需要GHzMHz,即频率
      • 我已经更新了我的答案。如果您需要更多信息,请告诉我
      • 这个更新的答案包含了我想到的所有可能的测试用例,如果你有另一个测试用例,请告诉我。对于上述所有测试用例,它工作得非常好
      【解决方案4】:

      我的两分钱:

      selected_strings = list(filter(
          lambda x: re.findall(r'(?:^|\s+)\d+\s+(?:G|M)Hz', x),
          strings
      ))
      

      ['2 GHz', '5.8 GHz', ' 5 GHz', '3.4 MHz', '3 MHz', '1 MHz of Frequency']strings,此处为selected_strings

      ['2 GHz', '   5 GHz', '3 MHz', '1 MHz of Frequency']
      

      【讨论】:

      • 您好 PieCot,您能否更新字符串 1 MHz of Frequency 的正则表达式,因为它与答案一起被过滤:)
      • 其实我试过了,效果很好。我将它添加到示例字符串中。
      猜你喜欢
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多