【发布时间】:2010-11-16 13:20:27
【问题描述】:
我有以下几行(很多很多):
...
gfnfgnfgnf: 5656756734
arvervfdsa:1343453563
特别:4685685685
erveveersd:3453454545
verveversf: 7896789567
..
我想做的是找到'特定'行(':'之后的任何数字) 并将此号码替换为“111222333”。如何使用 python 正则表达式做到这一点?
【问题讨论】:
我有以下几行(很多很多):
...
gfnfgnfgnf: 5656756734
arvervfdsa:1343453563
特别:4685685685
erveveersd:3453454545
verveversf: 7896789567
..
我想做的是找到'特定'行(':'之后的任何数字) 并将此号码替换为“111222333”。如何使用 python 正则表达式做到这一点?
【问题讨论】:
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 没有用);-)
【讨论】:
确定需要正则表达式?
other_number = '111222333'
some_text, some_number = line.split(': ')
new_line = ': '.join(some_text, other_number)
【讨论】:
#!/usr/bin/env python
import re
text = '''gfnfgnfgnf: 5656756734
arvervfdsa: 1343453563
particular: 4685685685
erveveersd: 3453454545
verveversf: 7896789567'''
print(re.sub('[0-9]+', '111222333', text))
【讨论】:
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
【讨论】:
这里很重要的一点是,如果你有很多行,你想要一个一个地处理它们。也就是说,不是在替换它们时读取所有行,然后再次写出,而是一次读入一行,一次写出一行。 (如果您实际上一次从磁盘读取一行,这将是低效的;但是,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)
这将提高速度和内存效率。
【讨论】:
您的 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
【讨论】: