2015-04-23 2 views
0

У меня есть грязные данные, которые нужно тщательно прочистить. В принципе, мне нужно сущность-код некоторых строк, которые содержат одиночный & в &. К сожалению, некоторые строки также имеют в них другие объекты символов, поэтому это означает, что я не могу выполнить прямую глобальную замену.Преобразование & & при сохранении существующих ссылок на объекты

Я обнаружил некоторые из 4 миллионов строк плюс то, что я видел до сих пор, говорит о том, что большая часть одиноких & s окружена пробелами, но я не уверен на 100%.

Это немного выше моего регулярного выражения.

+1

Какой язык вы используете? –

+0

Python для этого. – katesporks

ответ

0

Вы можете использовать (\W)&(\W) найти .. и заменить $1&$2

+0

Как я уже сказал, не все одинокие '&' могут быть окружены пробелами. На первый взгляд, я нашел несколько, которые НЕ являются и не могут быть изменены из-за того, что это название работы. – katesporks

+0

что они окружены .. и если да, то почему их называют одинокими? –

+0

Я использую одинокий, чтобы означать, что & не является частью символьной сущности. Пример: 'title = '& mpersand: Приключения в Typ ...'' Заголовок & не является объектом. Вот еще один пример: 'title = '* @ ## & @ !!: When All Goes to Hell'' Опять же, не маркер объекта. – katesporks

0

Пропустить те, которые уже действующие лица.

Возможно, сначала посмотрите, какие именованные объекты у вас есть в вашей коллекции. Я не пытался создать полное, всеобъемлющее регулярное выражение. Вы хотите убедиться, что в регулярном выражении есть все, что вы на самом деле используете. Что-то вроде

grep -Eio '&[a-z]+;' file more files | sort | uniq -c | sort -rn 

покажет вам список частот возможных именных объектов. Затем вы можете сделать что-то вроде

perl -i.bak -pe 's/&(?!(?:#(?:\d+|x\x+)|amp|lt|gt|quot|apos|nbsp);)/&/g' file more files 

Это несколько специальных - вы должны расширить список именованных сущностей со всеми теми, у вас есть в вашей коллекции. Может быть, у вас много → или … или © или Å или что там там - вы не показываете нам образцы, поэтому мы не можем знать. Есть, конечно, several scores of official named entities, которые отсутствуют в этом быстром и грязном доказательстве концепции.

0

Используйте отрицательный lookahead, чтобы найти один & s.

В соответствии с правилами имя сущности, действительное имя сущности начинается с _ или письмом (в этом случае только буквы, цифры и один ; может следовать) нотой, или он сопровождаемая #, цифры , и завершение ;. Ваш пример &1111; поэтому не действительный объект XML, а & следует заменить на &.

Используйте эту GREP последовательность, чтобы найти бродячие амперсанды:

&(?![_a-zA-Z]\w*;)(?!#\d+;) 

и заменить

& 

записки Есть еще несколько символов допускаются. См. NameStartChar и NameChar в http://www.w3.org/TR/REC-xml/#NT-Name для списка задержания.

0
s/&(?![a-zA-Z#])/&/g 

не будет превышать.

Амперсанд, за которым следует буква, может быть ссылкой на именованный символ, а амперсанд, за которым следует символ #, может быть ссылкой на числовой символ.

Это подрывает недопустимые имена объектов, такие как &notanentity;.

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

Смежные вопросы