построчно считывать файл и заменять детали на boto3 в лямбда-AWS - PullRequest
0 голосов
/ 23 ноября 2018

Я борюсь с AWS lambda boto3: я хочу прочитать файл построчно и заменить выделенные выражения в каждой строке

s3 = boto3.client('s3')

def lambda_handler(event, context):

print(event)

bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']

obj = s3.get_object(Bucket=bucket, Key=key)

for text in obj['Body'].read().decode('utf-8').splitlines():
    if "ABC" in text:
        print(text)

код работает хорошо, и журналы показывают мне только строкиМеня интересует. Теперь я попытался заменить некоторые выражения в строке, но «заменить или суб» работал:

пример строки: ABC <123> <abg 46547> <!ab123>

Я хочу прийти к:ABC_123_46547_ab123

есть ли регулярное выражение для boto3 для замены частей строки?Спасибо за помощь!

1 Ответ

0 голосов
/ 06 декабря 2018

Помимо приведенного вами примера, вы не указали какой-либо конкретный набор правил для замены строк, поэтому мне нужно угадать, каковы ваши намерения.

Вот несколькоопции.Первый - это метод грубой силы, который просто выполняет буквальные замены.Второе и третье используют регулярные выражения для более общего и расширяемого подхода.

import re

# in:  ABC  <123>  <abg 46547>  <!ab123>
# out: ABC_123_46547_ab123
#
# Need to substitute the following:
# "  <abg " with "_"
# "  <!" with "_"
# "  <" with "_"
# ">" with ""

# ------------------------------------------------
# 1st option
# ------------------------------------------------
s1 = "ABC  <123>  <abg 46547>  <!ab123>"

s2 = s1 \
    .replace("  <abg ", "_") \
    .replace("  <!", "_") \
    .replace("  <", "_") \
    .replace(">", "")

print("Option #1: literal")
print("\tbefore : {}".format(s1))
print("\tafter  : {}".format(s2))

# ------------------------------------------------
# 2nd option
# ------------------------------------------------
s3 = s1

replacements_literal = [
    ("  <abg ", "_"),
    ("  <!", "_"),
    ("  <", "_"),
    (">", "")
]

for old, new in replacements_literal:
    s3 = re.sub(old, new, s3)

print("\nOption #2: literal, with loop")
print("\tbefore : {}".format(s1))
print("\tafter  : {}".format(s3))

# ------------------------------------------------
# 3rd option
# ------------------------------------------------
s4 = s1

replacements_regex = [
    (" *<[a-z]+ *", "_"),
    (" *<!", "_"),
    (" *<", "_"),
    (">", "")
]

for old, new in replacements_regex:
    s4 = re.sub(old, new, s4)

print("\nOption #3: regex, with loop")
print("\tbefore : {}".format(s1))
print("\tafter  : {}".format(s4))

Вывод выглядит так:

Option #1: literal
        before : ABC  <123>  <abg 46547>  <!ab123>
        after  : ABC_123_46547_ab123

Option #2: literal, with loop
        before : ABC  <123>  <abg 46547>  <!ab123>
        after  : ABC_123_46547_ab123

Option #3: regex, with loop
        before : ABC  <123>  <abg 46547>  <!ab123>
        after  : ABC_123_46547_ab123
...