【问题标题】:Regular expression to get the first match in a text file获取文本文件中第一个匹配项的正则表达式
【发布时间】:2021-06-02 04:13:10
【问题描述】:

我里面有一个文本文件是:

"000000002|ROOT |237277309|000000003|ROOT |337277309|000000004|ROOT |437277309|"

现在我正在尝试使用正则表达式来获取“|ROOT”之前的第一块数字,该数字是000000002

我尝试使用:

with open(file, 'r', encoding='utf-8', errors='ignore') as f:
    lines = f.read()  
    x = re.findall("^\s*[0-9].(ROOT$)", lines)[0]

print(x)

而且它不起作用。我的策略是让字符串以数字开头并以 ROOT 结尾,并获得第一个匹配项。

【问题讨论】:

    标签: python python-3.x regex


    【解决方案1】:

    ROOT$ 需要与行尾相邻的四个字符 ROOTfindall 返回所有匹配项;如果您只关心第一个,可能只需使用matchsearch

    with open(file, 'r', encoding='utf-8', errors='ignore') as f:
        for line in f:
            m = re.match(r'(\d+)\|ROOT', line)
            if m:
                print(m.group(1))
                break
    

    break 会在找到第一个匹配项后立即终止循环。我们一次读取一行,直到找到匹配的一行,然后终止。 (这也通过避免不必要地读取我们不关心的行,并避免一次将多行读取到内存中来优化程序。)正则表达式中的括号导致它们内部的匹配被捕获到@987654328 @。

    【讨论】:

      【解决方案2】:

      查看此代码:

      import re
      # 000000002|ROOT |237277309|000000003|ROOT |337277309|000000004|ROOT |437277309|
      
      file = './file.txt'
      with open(file, 'r', encoding='utf-8', errors='ignore') as f:
          lines = f.read()  
          x = re.findall(r"(\d*[0-9])\|ROOT", lines)
          print(x)
          x = re.findall(r"(\d*[0-9])\|ROOT", lines)[0]
          print(x)
      

      输出:

      ['000000002', '000000003', '000000004']
      000000002
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 2010-09-11
        相关资源
        最近更新 更多