我有以下几行(很多很多):
...
gfnfgnfgnf:5656756734
arvervfdsa:1343453563
特别是:4685685685
erveveersd:3453454545
verveversf:7896789567
..
我想做的是找到'特定'的行(无论数字在':'之后) 并将此号码替换为“111222333”。我怎么能用python正则表达式做到这一点?
答案 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