【问题标题】:Python Regex Problems and groupingPython 正则表达式问题和分组
【发布时间】:2016-03-02 17:33:25
【问题描述】:

我正在尝试从具有以下行的文本文件中解析数据:

On 1-1-16 1:48 Bob used: 187
On 1-5-16 2:50 Bob used: 2

我只想打印使用的时间和数字,所以它看起来像:

1-1-16, 1:48, 187
1-5-16, 2:50, 2

我正在使用这个正则表达式:

print(re.search(r"On ([0-9,-, ]+)Bob used ([0-9\.]+)", line.strip()))

我得到的结果是 <_sre.sre_match span="(23," match="Bob used: 187">

我尝试使用 .group() 但它给出了错误“'NoneType' 对象没有属性 'group'”我还注意到它只找到第二个分组(数字)而不是第一个(日期和时间) .

如何解决这个问题?

【问题讨论】:

    标签: python regex python-3.x


    【解决方案1】:

    您在Bob used 之后缺少:,您需要更精确地表达日期部分 - 例如,\d+-\d+-\d+ \d+:\d+

    >>> s = 'On 1-1-16 1:48 Bob used: 187 On 1-5-16 2:50 Bob used: 2'
    >>> re.search(r"On (\d+-\d+-\d+ \d+:\d+) Bob used: ([0-9\.]+)", s).groups()
    ('1-1-16 1:48', '187')
    

    【讨论】:

    • 某事告诉我这是转录错字,因为print 被点击,但根据代码,错误代码出现在用于.group()search 中,但不是用于print。无论如何都很好。
    • 谢谢解决了。 ShadowRanger 的回答也有帮助,因为它在第一次得到“无”后就失败了。我希望我能对两者都投赞成票,谢谢你们的帮助。
    【解决方案2】:

    你没有提供足够的信息来说明你是如何使用它的,但是由于你得到了一个 Match 对象,所以当你调用 .group() 时它不应该是 None 除非你失败了将结果存储到正确的位置。很可能您正在处理许多行,其中一些匹配,而另一些不匹配,并且您没有在访问组之前检查是否匹配。

    您的代码在进一步使用它之前应该始终验证它是否获得了Match;确保您的测试结构如下:

    match = re.search(r"On ([0-9,-, ]+)Bob used ([0-9\.]+)", line.strip())
    if match is not None:
        ... do stuff with match.group() here ...
    ... but not here ...
    

    【讨论】:

      【解决方案3】:

      我自己对正则表达式很陌生,但是我想出了这个

      import re
      source = "On 1-1-16 1:48 Bob used: 187\nOn 1-5-16 2:50 Bob used: 2" 
      x=re.finditer('([0-9]-)+[0-9]+',source)
      y=re.finditer('[0-9]+:[0-9]+',source)
      z=re.finditer(': [0-9]*',source)
      L = []
      for i,j,k in zip(x,y,z):
          L.append((i.group(), j.group(), k.group().replace(': ', '') ))
      
      print(L)
      

      输出

      [('1-1-16', '1:48', '187'), ('1-5-16', '2:50', '2')]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        • 2014-11-29
        • 1970-01-01
        相关资源
        最近更新 更多