Диакритических знаков и регулярных выражений в р
В R у меня есть столбец, который должен содержать только одно слово. Он создается, принимая содержимое другого столбца и с регулярным выражением только сохраняя последнее слово. Однако для некоторых строк это не работает, и в этом случае R просто копирует содержимое из первого столбца. Вот мой R
df$precedingWord <- gsub(".*?\W*(\w+-?)\W*$","\1", df$leftContext, perl=TRUE)
Предшествующее слово должно содержать только одно слово. Он извлекается из leftContext с помощью регулярного выражения. Это прекрасно работает в целом, но не с диакритикой. В паре строк левого текста есть буквы с диакритические знаки, такие как é
и à
. По какой-то причине R игнорирует эти элементы полностью и просто копирует все это в precedingWord. Я нахожу это странным, потому что практически невозможно, чтобы регулярное выражение соответствовало всему этому - как вы можете видеть здесь. В Примере тестовая строка является leftContext и подстановка должна быть *precedingWord.
Как вы видите в примере выше, выходные данные в онлайн-тестере регулярных выражений отличаются от выходных данных Я получаю. Я просто получаю точную копию leftContext. Это не значит, что выход в онлайн-тестере-это то, что нужно. Теперь инструмент рассматривает буквы с диакритическими знаками как несловесные символы и, таким образом, не помечает их как выходные данные, которые я хочу. Но на самом деле, я хочу представить их в виде символов word, чтобы они имели право на вывод.
Если это входные данные:
Un premier projet prévoit que l'établissement verserait 11 FF par an et par élève du secondaire et 30 FF par étudiant universitaire, une somme à évaluer et à
Outre le prêt-à-
And à
Sur base de ces données, on cherchera à
Ce sera encore le cas ce vendredi 19 juillet dans l'é
Тогда это выход, который я ожидаю
à
prêt-à-
à
à
é
Это регулярное выражение, которое у меня уже есть
.*?W*(w+?-?)W*$
Я уже использование stringi в моем проекте, так что если это дает решение, я мог бы использовать его.
1 ответ:
В Perl-подобном регулярном выражении любую букву Юникода можно сопоставить с классом сокращений
\p{L}
, а все символы, не являющиеся Юникодом, можно сопоставить с обратным классом\P{L}
. См. regular-expressions.info :Можно сопоставить один символ, относящийся к категории "буква", С
\p{L}
. Вы можете сопоставить один символ , не принадлежащий к этой категории, с\P{L}
.Таким образом, регулярное выражение, которое вы можете использовать, является
df$precedingWord <- gsub(".*?\\P{L}*(\\p{L}+-?)\\P{L}*$","\\1", df$leftContext, perl=TRUE)