Pyspark - Regex - извлечение значения из последних скобок - PullRequest
1 голос
/ 19 февраля 2020

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

Знаете ли вы, как ее решить?

    tmp= spark.createDataFrame(
    [
        (1, 'foo (123) oiashdj (hi)'), 
        (2, 'bar oiashdj (hi)'),
    ],
    ['id', 'txt'] 
)


tmp = tmp.withColumn("old", regexp_extract(col("txt"), "(?<=\().+?(?=\))", 0));

tmp = tmp.withColumn("new", regexp_extract(col("txt"), "\(([^)]+)\)?$", 0));

tmp.show()

+---+--------------------+---+----+
| id|                 txt|old| new| needed
+---+--------------------+---+----+
|  1|foo (123) oiashdj...|123|(hi)|  hi 
|  2|    bar oiashdj (hi)| hi|(hi)|  hi
+---+--------------------+---+----+

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Для извлечения подстроки между круглыми скобками без других круглых скобок в конце строки вы можете использовать

tmp = tmp.withColumn("new", regexp_extract(col("txt"), r"\(([^()]+)\)$", 1));

Подробности

  • \( - соответствует (
  • ([^()]+) - захватывает в Группу 1 любые 1+ символов кроме ( и )
  • \) - ) char
  • $ - в конце строки.

Аргумент 1 указывает regexp_extract извлечь значение группы 1.

См. regex demo online .

ПРИМЕЧАНИЕ : чтобы разрешить конечный пробел, добавьте \s* прямо перед $: r"\(([^()]+)\)\s*$"

NOTE2 : чтобы сопоставить последнее вхождение такой подстроки в более длинной строке с точно таким же кодом, как указано выше, используйте

r"(?s).*\(([^()]+)\)"

. .* захватит весь текст до конца, и затем возврат будет делать работу.

1 голос
/ 19 февраля 2020

Это должно работать. Используйте его с однострочным флагом.

\([^\(\)]*?\)(?!.*\([^\(\)]*?\))

https://regex101.com/r/Qrnlf3/1

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