我有一些需要以巧妙方式清理的脏数据。基本上,我需要将包含单独&
的一些字符串实体编码到&
中。不幸的是,一些字符串中还包含其他字符实体,这意味着我无法进行直接的全局替换。
我已经检查了400多万字符串中的一些字符串,到目前为止我所看到的内容表明大多数单独的字符都被空格所包围,但我不是100%肯定的。
这有点超出了我的正则表达式。
答案 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实体,而&
应替换为&
。
使用此GREP序列来定位迷路&符号:
&(?![_a-zA-Z]\w*;)(?!#\d+;)
并替换为
&
note 还允许更多字符。有关延迟列表,请参阅http://www.w3.org/TR/REC-xml/#NT-Name中的NameStartChar
和NameChar
。
答案 3 :(得分:0)
s/&(?![a-zA-Z#])/&/g
不会过度匹配。
&符号后跟字母可以是命名字符引用,而&符号后跟#
字符可以是数字字符引用。
这将低估无效的实体名称,例如¬anentity;
。
你可以收紧它以匹配不属于数字字符引用的&#
,但我会看到数字引用是否显示在你的语料库中。