转换&到&同时保留现有实体参考

时间:2015-04-23 18:21:17

标签: regex string

我有一些需要以巧妙方式清理的脏数据。基本上,我需要将包含单独&的一些字符串实体编码到&中。不幸的是,一些字符串中还包含其他字符实体,这意味着我无法进行直接的全局替换。

我已经检查了400多万字符串中的一些字符串,到目前为止我所看到的内容表明大多数单独的字符都被空格所包围,但我不是100%肯定的。

这有点超出了我的正则表达式。

4 个答案:

答案 0 :(得分:0)

您可以使用(\W)&(\W)查找..并替换为$1&$2

答案 1 :(得分: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

答案 2 :(得分:0)

使用否定前瞻来查找单个&

每个实体名称规则,有效的实体名称以_或字母开头(在这种情况下,只能跟随字母,数字和单个; note < / em> ,或后跟#,数字和终止;。因此,您的示例&1111; 是有效的XML实体,而&应替换为&amp;

使用此GREP序列来定位迷路&符号:

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

并替换为

&amp;

note 还允许更多字符。有关延迟列表,请参阅http://www.w3.org/TR/REC-xml/#NT-Name中的NameStartCharNameChar

答案 3 :(得分:0)

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

不会过度匹配。

&符号后跟字母可以是命名字符引用,而&符号后跟#字符可以是数字字符引用。

这将低估无效的实体名称,例如&notanentity;

你可以收紧它以匹配不属于数字字符引用的&#,但我会看到数字引用是否显示在你的语料库中。