Заменить часть строки с помощью регулярного выражения Python - PullRequest
0 голосов
/ 16 ноября 2010

У меня есть следующие строки (много, много):
...
gfnfgnfgnf: 5656756734
arvervfdsa: 1343453563
частности: 4685685685
erveveersd: 3453454545
verveversf: 7896789567
..

Что я хотел бы сделать, это найти строку «конкретный» (независимо от того, какой номер следует после «:») и заменить это число на «111222333».Как я могу сделать это, используя регулярные выражения Python?

Ответы [ 6 ]

3 голосов
/ 16 ноября 2010

Конечно, вам нужно регулярное выражение?

other_number = '111222333'
some_text, some_number = line.split(': ')
new_line = ': '.join(some_text, other_number)
3 голосов
/ 16 ноября 2010
for line in input:
    key, val = line.split(':')
    if key == 'particular':
       val = '111222333'

Я не уверен, что регулярное выражение будет иметь какое-либо значение в этом конкретном случае. Я думаю, они будут медленнее. Тем не менее, это может быть сделано. Вот один из способов:

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

В этом есть тонкости, и это почти наверняка не то, что вы хотели бы в производственном коде. Вам нужно проверить все константы re модуля, чтобы убедиться, что регулярное выражение работает так, как вы ожидаете, и т. Д. Вы можете быть удивлены гибкостью, с которой вы сталкиваетесь при решении подобных проблем в Python, если вы попытаетесь не использовать re ( Конечно, это не значит, что он бесполезен) ;-)

2 голосов
/ 16 ноября 2010
#!/usr/bin/env python
import re

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

print(re.sub('[0-9]+', '111222333', text))
0 голосов
/ 16 ноября 2010

Ваш пример с 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
0 голосов
/ 16 ноября 2010

Важным моментом здесь является то, что если у вас много строк, вы хотите обрабатывать их одну за другой. То есть вместо того, чтобы читать все строки, заменяя их и записывая их снова, вы должны читать по очереди за раз и записывать по очереди за раз. (Это было бы неэффективно, если бы вы на самом деле читали строку с диска за раз; однако, ввод-вывод Python компетентен и будет буферизовать файл для вас.)

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

Это будет эффективно по скорости и памяти.

0 голосов
/ 16 ноября 2010
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 -e 's/^particular: [0-9].*$/particular: 111222333/g' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...