что я использую, чтобы соответствовать символам MS Word в regEx - PullRequest
0 голосов
/ 12 мая 2009

Мне нужно найти и удалить все нестандартные символы ascii, которые есть в строке (обычно доставляются туда MS Word). Я не совсем уверен, что это за символы ... такие как причудливый апостроф, двойные кавычки и все такое. Это юникод? Я знаю, как это сделать неуклюже [a-z и т. Д.], Но я надеялся, что есть более элегантный способ просто исключить все, что не на клавиатуре.

Ответы [ 6 ]

2 голосов
/ 12 мая 2009

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

[\x80-\x9F]

это работает, потому что проблема с "символами Word" для меня - это те, которые недопустимы в Юникоде, и у меня нет способа санировать ввод пользователя.

1 голос
/ 13 августа 2009

Я обычно использую макрос JEdit, который заменяет наиболее распространенный из них более дружественной к ascii версии, т.е.

  • дефисы и тире со знаком минус;
  • точек наложения (один символ) на несколько точек;
  • пункт списка от звездочки;
  • и т.д.

Он легко адаптируется к Word / Openoffice / любой другой, и, конечно, изменяется в соответствии с вашими потребностями. Я написал статью на эту тему: http://www.megadix.it/node/138

Приветствия

1 голос
/ 12 мая 2009

Приложения Microsoft печально известны тем, что используют причудливые символы, такие как фигурные кавычки, тире и т. Д., Которые требуют специальной обработки без добавления какого-либо реального значения. В некоторых случаях все, что вам нужно сделать, это убедиться, что вы используете один из их расширенных наборов символов для чтения текста (например, windows-1252 вместо ISO-8859-1). Но есть несколько инструментов, которые заменяют этих причудливых персонажей их равнозначными, но универсально поддерживаемыми эквивалентами. Google для "деморонизатор" или "AsciiDammit".

0 голосов
/ 12 мая 2009

Что бы я сделал, используйте AutoHotKey , или python SendKeys или какой-нибудь визуальный базис, который отправил бы мне все возможные ключи (также с измененным и не примененным) к Документ Word.

В SendKeys это будет скрипт вида

chars = ''.join([chr(i) for i in range(ord('a'),ord('z'))])
nums = ''.join([chr(i) for i in range(ord('0'),ord('9'))])
specials = ['-','=','\','/',','.',',','`']
all = chars+nums+specials
SendKeys.SendKeys("""
    {LWIN}
    {PAUSE .25}
    r
    winword.exe{ENTER}
    {PAUSE 1}
    %(all)s
    +(%(all)s)
    "testQuotationAndDashAutoreplace"{SPACE}-{SPACE}a{SPACE}{BS 3}{LEFT}{BS}
    {Alt}{PAUSE .25}{SHIFT}
    changeLanguage
    %(all)s
    +%(all)s
"""%{'all':all})

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

Если символ в текстовом документе результата - он отображается, в противном случае нет. Нет необходимости в регулярных выражениях. После этого вы, конечно, можете встраивать диапазон символов в скрипт или программу.

0 голосов
/ 12 мая 2009

Мое решение этой проблемы - написать скрипт на Perl, который выдаст мне все символы, находящиеся за пределами диапазона ASCII (0–127):

#!/usr/bin/perl

use strict;
use warnings;

my %seen;
while (<>) {
    for my $character (grep { ord($_) > 127 } split //) {
        $seen{$character}++;
    }
}

print "saw $_ $seen{$_} times, its ord is ", ord($_), "\n" for keys %seen;

Затем я создаю сопоставление этих символов с тем, что я хочу, чтобы они были, и заменяю их в файле:

#!/usr/bin/perl

use strict;
use warnings;

my %map = (
    chr(128) => "foo",
    #etc.
);

while (<>) {
    s/([\x{80}-\x{FF}])/$map{$1}/;
    print;
}
0 голосов
/ 12 мая 2009

Вероятно, вы смотрите на символы Юникода в формате UTF-8. Если это так, просто избегайте их на языке регулярных выражений.

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