Диакритических знаков и регулярных выражений в р


В 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 3

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)