【问题标题】:Replace part of string using python regular expression使用python正则表达式替换部分字符串
【发布时间】:2010-11-16 13:20:27
【问题描述】:

我有以下几行(很多很多):
...
gfnfgnfgnf: 5656756734
arvervfdsa:1343453563
特别:4685685685
erveveersd:3453454545
verveversf: 7896789567
..

我想做的是找到'特定'行(':'之后的任何数字) 并将此号码替换为“111222333”。如何使用 python 正则表达式做到这一点?

【问题讨论】:

    标签: python regex replace


    【解决方案1】:
    for line in input:
        key, val = line.split(':')
        if key == 'particular':
           val = '111222333'
    

    我不确定正则表达式在这种特定情况下是否有任何价值。我的猜测是他们会慢一些。也就是说,这是可以做到的。这是一种方法:

    for line in input:
        re.sub('^particular : .*', 'particular : 111222333')
    

    其中涉及一些微妙之处,这几乎肯定不是您在生产代码中想要的。您需要检查所有 re 模块常量以确保正则表达式按照您期望的方式运行等。如果您尝试不使用 re (of当然,这并不是说 re 没有用);-)

    【讨论】:

      【解决方案2】:

      确定需要正则表达式?

      other_number = '111222333'
      some_text, some_number = line.split(': ')
      new_line = ': '.join(some_text, other_number)
      

      【讨论】:

        【解决方案3】:
        #!/usr/bin/env python
        import re
        
        text = '''gfnfgnfgnf: 5656756734
        arvervfdsa: 1343453563
        particular: 4685685685
        erveveersd: 3453454545
        verveversf: 7896789567'''
        
        print(re.sub('[0-9]+', '111222333', text))
        

        【讨论】:

          【解决方案4】:
          input = """gfnfgnfgnf: 5656756734
          arvervfdsa: 1343453563
          particular: 4685685685
          erveveersd: 3453454545
          verveversf: 7896789567"""
          
          entries = re.split("\n+", input)
          
          for entry in entries:
            if entry.startswith("particular"):
              entry = re.sub(r'[0-9]+', r'111222333', entry)
          

          或使用 sed:

          sed -e 's/^particular: [0-9].*$/particular: 111222333/g' file
          

          【讨论】:

            【解决方案5】:

            这里很重要的一点是,如果你有很多行,你想要一个一个地处理它们。也就是说,不是在替换它们时读取所有行,然后再次写出,而是一次读入一行,一次写出一行。 (如果您实际上一次从磁盘读取一行,这将是低效的;但是,Python 的 IO 可以胜任并且会为您缓冲文件。)

            with open(...) as infile, open(...) as outfile:
                for line in infile:
                    if line.startswith("particular"):
                        outfile.write("particular: 111222333")
                    else:
                        outfile.write(line)
            

            这将提高速度和内存效率。

            【讨论】:

              【解决方案6】:

              您的 sed 示例迫使我说整洁!

              python -c "import re, sys; print ''.join(re.sub(r'^(particular:) \d+', r'\1 111222333', l) for l in open(sys.argv[1]))" file
              

              【讨论】:

                猜你喜欢
                • 2017-11-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-01-25
                • 2022-11-07
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多