【问题标题】:Find a pattern (float +'\t' + float) in text file在文本文件中查找模式 (float +'\t' + float)
【发布时间】:2018-02-21 23:17:32
【问题描述】:

我有一些文本文件,我想在其中找到带有 float+'\t'+float 的模式存在于哪一行。

文本文件如下所示:

some information: bla bla
test time: 1.34
something else 23.00
data1 data2
0.01 0.22
0.2 0.34
.....

data1前面的文本信息行数可以不同,data1和data2也可以不同。

我更喜欢 pandas 的解决方案,但其他一切都可以接受。

【问题讨论】:

    标签: python regex pandas dataframe


    【解决方案1】:

    您似乎在询问如何查找包含 tab 的行,而不仅仅是带有空格的行。在这种情况下,你不需要这样的东西吗?

    >>> import re
    >>> re.match(r'^(?:[0-9.]+)\\t(?:[0-9.]+)$', r'0.01\t0.22')
    <_sre.SRE_Match object; span=(0, 10), match='0.01\\t0.22'>
    

    请注意在 t 之前存在双反斜杠。

    【讨论】:

      【解决方案2】:
      df
      
                              Col1
      0  some information: bla bla
      1            test time: 1.34
      2       something else 23.00
      3                data1 data2
      4                  0.01 0.22
      5                   0.2 0.34
      
      df = df.Col1.str.extract('(\d+\.\d+\s\d+\.\d+)', expand=False).to_frame()
      df
              Col1
      0        NaN
      1        NaN
      2        NaN
      3        NaN
      4  0.01 0.22
      5   0.2 0.34
      

      要删除nan 行,请使用df.dropna

              Col1
      4  0.01 0.22
      5   0.2 0.34
      

      正则表达式分解

      (       # open capture group
      \d+     # any number of digits
      \.      # literal dot (escaped)
      \d+     
      \s      # any whitespace (sub with \t for a more strict search)
      \d+\.\d+ 
      )       # close capture group
      

      【讨论】:

      • 感谢您的回答。有没有办法保留标题(data1和data2)?
      • @AldinDelic 您的意思是要将结果分配为现有 df 中的列?
      • @AldinDelic 如果我理解你的话,你可以使用df['Col2'] = df.Col1.str.extract('(\d+\.\d+\s\d+\.\d+)', expand=False)
      • @AldinDelic 尝试:df = df.Col1.str.extract('(?\d+\.\d+)\s(?\d+\.\d+)' , expand=False).to_frame()
      • @AldinDelic ^ .. 如果这就是你想要的
      【解决方案3】:
      ^.*\d*\.\d+\t\d*\.\d+.*$
      

      这将帮助您识别包含 floatTABfloat 值的行

      Regex Demo

      样本来源(run it here):

      import re
      regex = r"^.*\d*\.\d+\t\d*\.\d+.*$"
      matches = re.finditer(regex, test_str, re.MULTILINE)
      for match in matches:
          print(match.group(0))
      

      【讨论】:

      • 谢谢。只需要做一些“枚举”以获得行号。
      • @AldinDelic 就答案而言,这不是一个很好的答案。始终尽量避免对行进行迭代。这非常慢,并且会因大数据而失败。
      • @AldinDelic,很高兴知道我的回答帮助您找到了您正在寻找的解决方案。如果需要苹果,那么橙子就不能食用,尽管它可能对某些人来说味道更好。
      【解决方案4】:

      你首先需要一种方法来找到花车。 假设它们总是用点作为分隔符,下面会做:

      \d+(\.\d+)?
      
      \d+            Match one or more digits
          \.\d+      Match a dot followed by one or more digits...
         (     )?    ... maybe
      

      然后你需要匹配两个浮点数之间的空白字符:

      \s+
      

      全部放在一起:

      \d+(\.\d+)?\s+\d+(\.\d+)?
      

      使用 Python 和 re 进行测试:

      import re
      
      regex = re.compile("\d+(\.\d+)?\s+\d+(\.\d+)?")
      
      print(regex.match("0.2 0.34"))
      print(regex.match("0.01 0.22"))
      

      输出:

      <_sre.SRE_Match object; span=(0, 8), match='0.2 0.34'>
      <_sre.SRE_Match object; span=(0, 9), match='0.01 0.22'>
      

      现在如果你想捕捉花车:

      (\d+(\.\d+)?)\s+(\d+(\.\d+)?)
      

      您会在13 组中找到两个花车:

      import re
      
      regex = re.compile("(\d+(\.\d+)?)\s+(\d+(\.\d+)?)")
      
      result = regex.match("0.2 0.34")
      print(result.group(1))
      print(result.group(3))
      

      输出:

      0.2
      0.34
      

      【讨论】:

        猜你喜欢
        • 2022-01-15
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多