Regex: сопоставить все, кроме букв Unicode - PullRequest
0 голосов
/ 11 сентября 2018

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

Теперь я хотел бы использовать регулярные выражения для замены всего, кроме букв Юникода во фрейме данных Pandas. Я использовал

чтобы получить выражение регулярного выражения, которое, кажется, решает мою проблему \p{^L}+. Позже я понял, что нашел выражение, которое будет работать в Perl (Perl-совместимые регулярные выражения [PCRE]), не обязательно в Python. Я нашел пакет regex , который также поддерживает это выражение. Тем не менее, панды, похоже, еще не поддерживают регулярные выражения, или я использовал его неправильно:

import regex
import pandas as pd
df = pd.DataFrame({"text": ["Room: 25m²", "I have eaten ¼ of the cake."]})
df["text"] = df["text"].str.replace(regex.compile("\p{^L}+"), " ")

# Returns a TypeError: object of type '_regex.Pattern' has no len()

Поэтому я попытался найти способы использовать пакет re. Я нашел ответ здесь. Поэтому я использовал это так:

import re
import pandas as pd
df = pd.DataFrame({"text": ["Room: 25m²", "I have eaten ¼ of the cake."]})
df["text"] = df["text"].str.replace("[\W\d_]", " ")

Он заменяет множество специальных символов. Он не заменяет выражение с m на степень 2 или выражение, в котором мы имеем дробь. Оба символа, которые я бы не видел как буквы, а скорее цифры или специальные символы в юникоде. Итак, как я могу справиться с этими специальными персонажами? Это возможно с повторным пакетом? Я не хотел бы использовать конкретные юникоды, чтобы соответствовать этим случаям. Если возможно, общее решение будет оценено.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

[\W\d_] - это регулярное выражение, которое соответствует любому несловесному символу (любому символу, не сопоставленному с \w), оно соответствует цифрам с \d и _. Обратите внимание, что \d в Unicode регулярное выражение Python 3 соответствует только \p{Nd} (число, десятичное число):

Соответствует любой десятичной цифре Unicode (то есть любому символу в категории символов Unicode [Nd]).

Символы, которые этот шаблон не удаляет в вашей строке, относятся к категории \p{No} Unicode (числа, другие).

Итак, если вы планируете также удалить все эти символы из \p{No}, вам необходимо добавить их в шаблон:

r'[\u00B2\u00B3\u00B9\u00BC-\u00BE\u09F4-\u09F9\u0B72-\u0B77\u0BF0-\u0BF2\u0C78-\u0C7E\u0D58-\u0D5E\u0D70-\u0D78\u0F2A-\u0F33\u1369-\u137C\u17F0-\u17F9\u19DA\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215F\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA830-\uA835\U00010107-\U00010133\U00010175-\U00010178\U0001018A\U0001018B\U000102E1-\U000102FB\U00010320-\U00010323\U00010858-\U0001085F\U00010879-\U0001087F\U000108A7-\U000108AF\U000108FB-\U000108FF\U00010916-\U0001091B\U000109BC\U000109BD\U000109C0-\U000109CF\U000109D2-\U000109FF\U00010A40-\U00010A47\U00010A7D\U00010A7E\U00010A9D-\U00010A9F\U00010AEB-\U00010AEF\U00010B58-\U00010B5F\U00010B78-\U00010B7F\U00010BA9-\U00010BAF\U00010CFA-\U00010CFF\U00010E60-\U00010E7E\U00011052-\U00011065\U000111E1-\U000111F4\U0001173A\U0001173B\U000118EA-\U000118F2\U00011C5A-\U00011C6C\U00016B5B-\U00016B61\U0001D360-\U0001D371\U0001E8C7-\U0001E8CF\U0001F100-\U0001F10C\W\d_]+'

См. Демоверсию regex .

Вы можете увидеть символы, перечисленные на этой странице странице.

Также обратите внимание на число, букву , см. Список символов \p{Nl} здесь .

0 голосов
/ 11 сентября 2018

Это должно работать для вас:

import regex
import pandas as pd
df = pd.DataFrame({"text": ["Room: 25m²", "I have eaten ¼ of the cake."]})


regex_pat = re.compile(r"[^a-zA-Z\s]")
df["text"] = df["text"].str.replace(regex_pat, "")

Выход:

0                       Room m
1    I have eaten  of the cake
Name: text, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...