Регулярное выражение от Python до Kotlin - PullRequest
1 голос
/ 07 января 2020

У меня есть вопрос о Регулярном выражении (Regex), и я действительно новичок ie в этом. Я нашел учебник Regex, написанный на Python, чтобы удалить данные и заменить их пустой строкой. Это код из Python:

import re

def extract_identity(data, context):
    """Background Cloud Function to be triggered by Pub/Sub.
    Args:
         data (dict): The dictionary with data specific to this type of event.
         context (google.cloud.functions.Context): The Cloud Functions event
         metadata.
    """
    import base64
    import json
    import urllib.parse
    import urllib.request

    if 'data' in data:
        strjson = base64.b64decode(data['data']).decode('utf-8')
        text = json.loads(strjson)
        text = text['data']['results'][0]['description']

        lines = text.split("\n")
        res = []
        for line in lines:
            line = re.sub('gol. darah|nik|kewarganegaraan|nama|status perkawinan|berlaku hingga|alamat|agama|tempat/tgl lahir|jenis kelamin|gol darah|rt/rw|kel|desa|kecamatan', '', line, flags=re.IGNORECASE)
            line = line.replace(":","").strip()
            if line != "":
                res.append(line)

        p = {
            "province": res[0],
            "city": res[1],
            "id": res[2],
            "name": res[3],
            "birthdate": res[4],
        }

        print('Information extracted:{}'.format(p))

В вышеприведенной функции извлечение информации выполняется путем удаления всех меток e-KTP с регулярными выражениями.

Это образец e -KTP: enter image description here

И это результат сканирования этого e-KTP с использованием кода python:

Information extracted:{'province': 'PROVINSI JAWA TIMUR', 'city': 'KABUPATEN BANYUWANGI', 'id': '351024300b730004', 'name': 'TUHAN', 'birthdate': 'BANYUWANGI, 30-06-1973'}

Это полное руководство из приведенного выше code .

И затем мой вопрос: можем ли мы использовать Regex в Kotlin, чтобы удалить метку из результата e-KTP, как в python коде? Потому что я пробую некоторые логи c, которые, как я понимаю, не удаляют метку e-KTP. Мой код в Kotlin такой:

....

        val lines = result.text.split("\n")
        val res = mutableListOf<String>()
        Log.e("TAG LIST STRING", lines.toString())
        for (line in lines) {
            Log.e("TAG STRING", line)
            line.matches(Regex("gol. darah|nik|kewarganegaraan|nama|status perkawinan|berlaku hingga|alamat|agama|tempat/tgl lahir|jenis kelamin|gol darah|rt/rw|kel|desa|kecamatan"))
            line.replace(":","")

            if (line != "") {
                res.add(line)
            }
            Log.e("TAG RES", res.toString())

        }
        Log.e("TAG INSERT", res.toString())
        tvProvinsi.text = res[0]
        tvKota.text = res[1]
        tvNIK.text = res[2]
        tvNama.text = res[3]
        tvTgl.text = res[4]

        ....

И вот результат моего кода:

TAG LIST STRING: [PROVINSI JAWA BARAP, KABUPATEN TASIKMALAYA, NIK 320625XXXXXXXXXX, BRiEAFAUZEROMARA, Nama, TempatTgiLahir, Jenis keiamir, etc]

TAG INSERT: [PROVINSI JAWA BARAP, KABUPATEN TASIKMALAYA, NIK 320625XXXXXXXXXX, BRiEAFAUZEROMARA, Nama, TempatTgiLahir, Jenis keiamir, etc]

Метка все еще существует, возможно удалить метку с помощью Regex или что-то в Kotlin как в Python?

1 Ответ

2 голосов
/ 07 января 2020

Смысл в том, чтобы использовать kotlin.text.replace с Regex в качестве аргумента поиска. Например:

text = text.replace(Regex("""<REGEX_PATTERN_HERE>"""), "<REPLACEMENT_STRING_HERE>")

Вы можете использовать

line = line.replace(Regex("""(?i)gol\. darah|nik|kewarganegaraan|nama|status perkawinan|berlaku hingga|alamat|agama|tempat/tgl lahir|jenis kelamin|gol darah|rt/rw|kel|desa|kecamatan"""), "")

. Обратите внимание, что (?i) в начале шаблона - это быстрый способ сделать регистр без учета регистра.

Кроме того, когда вам нужно сопоставить . с регулярным выражением, вам нужно избежать его. Поскольку backsla sh может быть закодирована несколькими способами, и люди часто не могут сделать это правильно, всегда рекомендуется определять шаблоны регулярных выражений в raw строковых литералах, в Kotlin, вы можете использовать тройку строковые литералы, заключенные в двойные кавычки, то есть """...""", где каждый \ рассматривается как литерал backsla sh, который используется для формирования экранирования регулярных выражений .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...