使用python正则表达式替换部分字符串

时间:2010-11-16 13:20:28

标签: python regex replace

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

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

6 个答案:

答案 0 :(得分:3)

for line in input:
    key, val = line.split(':')
    if key == 'particular':
       val = '111222333'

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

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

这涉及到微妙之处,这几乎肯定不是您在生产代码中所需要的。你需要检查所有re模块常量,以确保正则表达式按照你期望的方式运行,等等。如果你试图不使用re(你在Python中处理类似问题的灵活性),你可能会感到惊讶当然,这并不是说re没有用);-)

答案 1 :(得分:3)

当然你需要一个正则表达式吗?

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

答案 2 :(得分:2)

#!/usr/bin/env python
import re

text = '''gfnfgnfgnf: 5656756734
arvervfdsa: 1343453563
particular: 4685685685
erveveersd: 3453454545
verveversf: 7896789567'''

print(re.sub('[0-9]+', '111222333', text))

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这里的一个重点是,如果你有很多行,你想逐个处理它们。也就是说,不是在替换它们时读取所有行,而是再次将它们写出来,而是应该一次读一行并一次写出一行。 (如果你实际上一次从磁盘读取一行,这将是低效的;但是,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)

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

答案 5 :(得分:0)

你的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