Как извлечь RegEx из Pandas Dataframe и использовать его с re.findall - PullRequest
0 голосов
/ 05 февраля 2019

Моя проблема началась, когда я сохранил все выражения RegEx в файле HDF5, а затем попытался извлечь их с помощью pandas dataframe.

Основная проблема заключается в том, что выражения RegEx, хранящиеся в pandas dataframe, не работают сre.findall.Что еще хуже, я использовал арабский Unicode в своих выражениях RegEx.

Чтобы упростить ситуацию, я привожу следующий пример:

Давайте предположим, что в переменной хранится следующий текст:

mytext = 'الفئران هم حيوانات غير معمرة لأن معدل استقلابهم مرتفع وضربات قلبهم سريعة'

И давайте получим следующее выражение RegEx:

pattern_they = r'([\u0621-\u064a]+\u0647\u0645|\b\u0647\u0645)\b'

Если мы используем код print(re.findall(pattern_they, mytext)), мы получим список из трех элементов:

['هم', 'استقلابهم', 'قلبهم']

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

pattern_they_new = "r'([\u0621-\u064a]+\u0647\u0645|\b\u0647\u0645)\b'"

И затем использовать этот шаблон в print(re.findall(pattern_they_new, mytext)), мы получим пустой список, который не является правильным.

Проблема в том, что все выражения RegEx, которые я извлек из фрейма данных pandas, заключены в двойные кавычки, как и pattern_they_new.Я не добавлял двойные кавычки, когда сохранял выражения RegEx;они добавляются автоматически при извлечении их из фрейма данных panda.

Я пытался сохранить выражения RegEx без r'…', но он также не работал с re.findall.

Как можноЯ решаю эту проблему?

Примечание: этот вопрос является продолжением другого вопроса, который был задан ранее: Как хранить и читать необработанные строки RegEx из кадра данных панд

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Я нашел решение проблемы, которое можно резюмировать следующим образом:

Я пытался сохранить выражения RegEx в HDF5, не оборачивая их r'...', но когда я затем извлек их из HDF5 через pandas dataframeони не рассматривались как необработанные строки, поэтому я не мог использовать их в re.findall.Вместо этого я использовал двойную обратную косую черту, как показано ниже:

pattern_they = '([\\u0621-\\u064a]+\\u0647\\u0645|\\b\\u0647\\u0645)\\b'

Однако, когда я извлек RegEx из кадра данных pandas, я получил что-то вроде:

pattern_they_imported ='([\\\\u0621-\\\\u064a]+\\\\u0646\\\\u0627|\\\\b\\\\u0646\\\\u062D\\\\u0646)\\\\b'

Поэтому я использовалreplace с re.findall, который работает!(Я получил список из трех элементов, который является правильным, как объяснено в моем посте с вопросом выше):

print(re.findall(pattern_they_imported.replace('\\\\', '\\'), mytext))

Интересно, почему двойная escape-обратная косая черта превратилась в четырех escape-обратную косую черту в RegEx, которую я извлек издатафрейм панд.В любом случае, мое решение работает, что для меня самое главное.

0 голосов
/ 05 февраля 2019

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

import re

mytext = "lorem ipsum dolor sit amet"

pattern = r'\b(ipsum)\b'
rx_new = r'{}'.format(pattern)

print(re.findall(rx_new, mytext))

, что будет правильно давать ['ipsum'].
Вам также необходимо добавить необработанный флаг.Остается вопрос: почему?

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